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

C++ template partial explicit instantiation

我们可以显式地部分实例化 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>;

模板不是 class。这是一个模板。 (构建蓝图class)。只有考虑到所有模板参数才能成为class。

写了这个(更正错别字):

template <typename T, int N>
class MyClass {

};

您完全可以这样做:

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

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

您也可以这样做:

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]>

但是,这个模板子集仍然没有被实例化。仅仅定义.

要实际实例化模板,无论是否部分特化,我们都必须为其命名,并考虑所有模板参数。