构造函数的部分模板专用化

Partial template specialization for constructor

本文关键字:专用 构造函数      更新时间:2023-10-16

我需要看起来像这样的类:

template<typename T, class S, size_t C>
class myClass
{
public:
myClass(); // Ctor
/*

*/
private:
S myData;
}

其中 T 是存储数据类型,S 是容器类型,C 是它的大小。方法不依赖于容器类型,但我仍然需要正确初始化 S。例如,让 S 被std::vector,我尝试过:

template<typename T, size_t C>
myClass<T, std::vector<T>, C>::myClass()
{
}

但我得到E0040 expected identifier错误。

你不能部分专用化一种方法,你可以部分专用化整个类,但需要一些重复。

由于您可以使用 C++17,因此您可以调整实现:

template<typename T, class S, size_t C>
myClass<T, S, C>::myClass()
{
if constexpr (std::is_same_v<S, std::vector<T>>) {
// special case
} else {
// regular case
}
}

在另一个选项(C++17 之前(中标记拆分,该选项的优点是允许成员初始值设定项列表:

template <typename T> struct tag{}; 
template <typename T, class S, size_t C>
class myClass
{
private:
myClass(tag<std::vector<T>>) : myData(/*special case */) {/* special case */}
template <typename U>
myClass(tag<U>) : myData(/*regular case */) {/* regular case */}
public:
myClass() : myClass(tag<S>{}) {}
private:
S myData;
};