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

yue*_*ngz 2 c++ partial-specialization template-meta-programming

我们可以显式地部分实例化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>;
Run Code Online (Sandbox Code Playgroud)

就像我们可以拥有的:

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

template class MyClass<int>;
template class MyClass<float>;
Run Code Online (Sandbox Code Playgroud)

Ric*_*ges 5

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

写了这个(拼写错误):

template <typename T, int N>
class MyClass {

};
Run Code Online (Sandbox Code Playgroud)

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

template<int N> class MyClass<int, N>;  
template<int N> class MyClass<float, N>;
Run Code Online (Sandbox Code Playgroud)

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

你也可以这样做:

template<int N> class MyClass<int, N> {};  
template<int N> class MyClass<float, N> {};
Run Code Online (Sandbox Code Playgroud)

其中部分专门MyClass用于<int, [all values of N]><float, [all values of N]>.

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

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