考虑以下模板化数组定义的人为示例:
template <typename t, unsigned int n> class TBase
{
protected:
t m_Data[n];
//...
};
template <typename t, unsigned int n> class TDerived : public TBase<t, n>
{
TDerived()
{
}
};
我可以特化这种类型来为长度为 2 的数组提供非默认构造函数,如下所示:
template <typename t> class TDerived<t, 2> : public TBase<t, 2>
{
public:
TDerived(const t& x0, const t& x1)
{
m_Data[0] = x0;
m_Data[1] = x1;
}
};
int main()
{
TDerived<float, 2> Array2D_A(2.0f, 3.0f); //uses specialised constructor
TDerived<float, 3> Array3D_A; //uses default constructor
return 0;
}
有没有其他方法可以创建一个类,该类具有在编译时受模板参数约束的不同构造函数选项,而不需要对每个变体进行完整的类特化?
换句话说,有什么方法可以在 TBase
中拥有专门的构造函数吗?类而不需要创建 TDerived
的中间步骤同时保留 TBase
的功能?
最佳答案
我认为从基类派生类与这里的问题无关,这只是一个实现细节。您真正想要的似乎是是否有一种方法可以部分专门化成员函数,例如构造函数。你想要这样的东西吗?
template <typename T, int N> class Foo
{
Foo(); // general
template <typename U> Foo<U, 2>(); // specialized, NOT REAL CODE
};
这行不通。你总是必须对整个类(class)进行特化。原因很简单:您必须先了解类的完整类型,才能您甚至知道存在哪些成员函数。考虑以下简单情况:
template <typename T> class Bar
{
void somefunction(const T&);
};
template <> class Bar<int>
{
double baz(char, int);
};
现在Bar<T>::somefunction()
取决于 T
, 但该函数仅在 T
时存在不是 int
,因为 Bar<int>
是一个完全不同的类。
或者考虑另一个专业 template <> class Bar<double> : public Zip {};
-- 甚至类的多态性在特化中也可能完全不同!
因此,您可以提供特化成员(包括构造函数)新声明的唯一方法是对整个类进行特化。 (您可以专门化现有函数的定义,请参阅@Alf 的回答。)
关于c++ - 具有专门构造函数的模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7026475/