我正在实现一个N维数组库。请考虑以下代码:
template<int Rank, class Type>
class Array {
{
public:
// constructor for vectors, valid when Rank==1
Array(int dim0, Type val = Type());
// constructor for matrices, valid when Rank==2
Array(int dim0, int dim1, Type val = Type());
...
}
问题是如果Type == int
,编译器会抱怨模糊的构造函数调用(例如,Array<1,int>(1,1)
)。是否有像enable_if
这样的技巧会使编译器忽略与Rank
不匹配的构造函数? (请不要使用C ++ 11)
谢谢
答案 0 :(得分:1)
您可以使用模板专业化:
template<int size, class Type>
class Array {
// General stuff for size > 2, if you have any
};
template <class Type>
class Array<1, Type>
{
// Code for one-dimensional array
};
template <class Type>
class Array<2, Type>
{
// Code for two-dimensional array
};
或者甚至为int指定它:
template <>
class Array<2, int>
{
// Code for two-dimensional integer array
};
他们拥有完全不同的公共接口集也是完全有效的。
但我可能会传递给定尺寸的数组或std::vector
或删除第三个参数,只需添加一个方法,比如populate(Type t)
来完成这个技巧(它也可能有用)不仅仅是为了建造)。