我想写一个类,它的内部实现取决于模板参数。例如(我不知道这是否可能),说我可以写一些类似的东西:
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;}
};
这是否可以使用模板? 请注意,我不希望有一个双*因为我想要一切都是静态的。
提前谢谢。
答案 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)。