我需要一个看起来像这样的课:
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
错误。
答案 0 :(得分:1)
您不能对方法进行部分专业化,可以对整个类进行部分专业化,但是需要一些重复。
由于可以使用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;
};