假设我有这门课:
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; }
您可以为此使用委托构造函数。
您可以创建一个私有构造函数,它采用
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)
,它处理所有情况共享的代码。
您考虑过继承吗?我想到的第一件事是创建一个从基类派生的
Test
类,该类将包含您希望 foo 和 bar 相同的所有内容。因此,您可以在派生类(测试)中调用基类构造函数,然后只为 Foo
和 bar
执行操作。