【发布时间】:2011-08-11 13:12:22
【问题描述】:
考虑以下人为设计的模板化数组定义示例:
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 的功能?
【问题讨论】:
-
您使用的是什么编译器和版本,是否支持C++0x?
-
@David Rodríguez - dribeas 我在 MSVC 2008/2010 之间切换,所以是和否。
-
为什么不把所有的构造函数都放进去呢?除非被使用,否则它们不会被实例化。
标签: c++ templates constructor metaprogramming