我有这样的事情:
template <typename T, int N> class Data {
typedef Data<T, N> data;
public:
T y;
data *ptr[N];
};
如果N == 2,我希望能够将变量和函数添加到类中,例如:
template <typename T, int N> class Data {
typedef Data<T, N> data;
public:
T y;
data *ptr[N];
/* if N == 2, add the following members to the class */
int x;
data *left() { return ptr[0] };
data *right() { return ptr[1] };
};
我知道可以使用继承或专业化,但它们都存在问题.
在这种特定情况下,继承没有任何意义,因为变量ptr指向同一个类,所以如果我使用:
template <typename T> class Data2 : Data<T, 2> {
typedef Data2<T> data;
public:
int x;
data *left() { return ptr[0] }; // Error (ptr has type Data<T,N>)
data *right() { return ptr[1] }; // Error
};
Data2从Data继承的变量ptr将指向Data类而不是Data2,从而使基类无用.
专业化的问题是我必须将整个基类复制到专门化,对于较小的情况,这可能没问题,但是如果我有一个非常复杂的类,或者我想要自定义变量和函数用于N的几个值,这是不切实际的.
我也知道std :: enable_if的存在,我认为它可以解决函数的问题,但对于变量则不然.
如果有人有解决方案或不同的方法可以绕过这个,请告诉我.
解决方法:
您可以将特定值N的模板声明专门化,并对基类中的公共代码使用另一级别的继承间接,这不依赖于N:
template <typename T> class DataBase {
public:
T y;
};
template <typename T, int N> class Data : public DataBase {
typedef Data<T, N> data;
public:
data *ptr[N];
};
而且,在不知道你真正想要什么的情况下,我会说类似的东西
typedef T DataType;
typedef T* DataTypePtr;
在基类中对我来说更有意义.