如何实现依赖于模板参数的内部实现的类?

时间:2014-05-06 04:38:54

标签: c++ templates

我想写一个类,它的内部实现取决于模板参数。例如(我不知道这是否可能),说我可以写一些类似的东西:

MyClass<double,1> a;

然后这将在编译时扩展为:

class MyClass{
double d;
public:
  MyClass(){d=0;}
};

如果我把它实例化为:

MyClass<double,2> a;

它将扩展为:

class MyClass{
double d[3];
public:
  MyClass(){for(int i=0;i<3;i++) d[i]=0;}
};

这是否可以使用模板? 请注意,我不希望有一个双*因为我想要一切都是静态的。

提前谢谢。

1 个答案:

答案 0 :(得分:2)

是的,您可以通过部分专业化来完成此任务:

// base template must be defined first
template <class T, std::size_t N>
class MyClass {
    T d[N+1];
public:
    MyClass() { for (std::size_t i=0; i<N+1; i++) d[i] = 0; }
};

// then the partial specialization for N = 1:
template <class T>
class MyClass<T, 1> {
    T d;
public:
    MyClass() { d = 0; }
};

我对基本版本有点不确定 - 当你使用值2进行实例化时,你会将它展示为扩展到数组中的三个项目,这就是我上面所做的。我希望期望是使用值3进行实例化的结果。如果这是您真正想要的,请将N+1更改为N

另请注意,至少对于专业版,您通常需要使用初始化而不是赋值,因此ctor更像是:

MyClass() : d(0) {}

或(最好):

MyClass() : d(T()) {}

您可能还希望包含无法编译的N=0专门化(或者,相当于在基本模板中使用static_assert以确保N&gt; 1)。