C ++模板部分显式实例化

时间:2016-08-11 22:30:08

标签: c++ template-meta-programming partial-specialization

我们可以显式地部分实例化C ++模板吗?

template class <typename T, int N>
class MyClass {
  ...
};

template<int N> class MyClass<int, N>;  // not meant for specification
template<int N> class MyClass<float, N>;

就像我们可以拥有的那样:

template class <typename T>
class MyClass {
  ...
};

template class MyClass<int>;
template class MyClass<float>;

1 个答案:

答案 0 :(得分:5)

模板不是类。这是一个模板。 (构建课程的蓝图)。只有在考虑了所有模板参数时,它才能成为一个类。

写了这个(错字更正):

template <typename T, int N>
class MyClass {

};

您可以通过各种方式执行此操作:

template<int N> class MyClass<int, N>;  
template<int N> class MyClass<float, N>;

但它不是实例化模板(因为它没有意义),也不是实例化由该模板形成的具体类。它实际上正在做的是向前声明模板的部分专用(可能是无限的)子集的存在。

你也可以这样做:

template<int N> class MyClass<int, N> {};  
template<int N> class MyClass<float, N> {};

MyClass<int, [all values of N]>具有部分专业<float, [all values of N]>

但是,此模板子集仍未实例化。仅仅定义了

实际实例化一个模板,无论是否部分专用,我们必须命名它,占所有模板参数。