有没有办法从专门的构造函数调用模板构造函数?

问题描述 投票:0回答:2

假设我有这门课:

template <class T>
class Test
{
    Test(T* x);

    const T* const t;
    int i{0};
};

我希望

t
始终使用
x
:

进行初始化
template <class T> Test<T>::Test(T* x) : t{x} {}

我有两个专业:

template <> Test<Foo>::Test(Foo* x) : t{x} { i = 1; }
template <> Test<Bar>::Test(Bar* x) : t{x} { i = 2; }

接下来,我用其他一些东西扩展该类,第一个(模板化)构造函数的作用不仅仅是设置

t
。我想为
T = Foo
T = Bar
做所有这些事情。

有什么方法可以从专门的构造函数中调用模板化构造函数吗?

// This does not work, since it will create a delegation cycle
template <> Test<Foo>::Test(Foo* x) : Test(x) { i = 1; }
template <> Test<Bar>::Test(Bar* x) : Test(x) { i = 2; }
c++ c++11 templates
2个回答
9
投票

您可以为此使用委托构造函数

您可以创建一个私有构造函数,它采用

t
的指针,以及
int
i
。然后您可以使用它来设置
x
i
,并运行所有共享代码。

看起来像:

template <class T>
class Test
{
public:
    Test(T* x) : Test(x, 0) { /*code for default case, runs after delegate*/ }
private:
    Test(T* t, int i) : t(t), i(i) { /*code to run for everything*/ }
    const T* const t;
    int i;
};

template <> Test<Foo>::Test(Foo* x) : Test(x, 1) { /*code only for Foo, runs after delegate*/ }
template <> Test<Bar>::Test(Bar* x) : Test(x, 2) { /*code only for Bar, runs after delegate*/ }

委托构造函数可以成为通用/模板化构造函数(与 Foo 和 Bar 的特定、专用构造函数具有相同的签名)吗?

不,这是不可能的。当您专门化函数模板时,您并不是在创建新函数,而是指定如果

T
被推导为您在专门化中指定的类型,则使用专门化定义代替通用定义。

这就是为什么我有“所有三个构造函数”(通用和两个专门化)调用

Test(T* t, int i)
,它处理所有情况共享的代码。


1
投票

您考虑过继承吗?我想到的第一件事是创建一个从基类派生的

Test
类,该类将包含您希望 foo 和 bar 相同的所有内容。因此,您可以在派生类(测试)中调用基类构造函数,然后只为
Foo
bar
执行操作。

© www.soinside.com 2019 - 2024. All rights reserved.