C – 基于模板参数将变量和函数添加到模板化类

我有这样的事情:

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;

在基类中对我来说更有意义.

上一篇:专注于C模板中的类型子集


下一篇:C模板专业化