2014-05-06 42 views
1

我想写一个类,使得它的内部实现取决于模板参数。举例来说(我不知道这是可能的),说我可以写这样的:如何实现依赖于模板参数的内部实现的类?

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;} 
}; 

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

预先感谢您。

回答

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 s更改为N

还要注意的是,至少为专业版,你通常要使用的初始化而不是分配的,所以构造函数会更喜欢:

MyClass() : d(0) {} 

或(最好):

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

您可能还希望包含N=0的专门知识,它们不会编译(或者在基本模板中使用static_assert以保证N> 1)。

+0

哇,我不知道部分专业化实际上意味着提供一个全新的结构/功能。我认为(显然是错误的),通过部分专业化,我给课堂增加了更多东西(比如继承)。我尝试了你的例子,我用sizeof来获得班级人数,而我惊讶的sizeof(Myclass )= 24和sizeof(MyClass )= 8 !!!。这是我想要的,谢谢! – Alejandro