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]>
。
但是,这个模板子集仍然没有被实例化。仅仅定义.
要实际实例化模板,无论是否部分特化,我们都必须为其命名,并考虑所有模板参数。
我们可以显式地部分实例化 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]>
。
但是,这个模板子集仍然没有被实例化。仅仅定义.
要实际实例化模板,无论是否部分特化,我们都必须为其命名,并考虑所有模板参数。