[英]Partial template specialization for constructor
我需要一个看起来像这样的 class:
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
错误。
您不能部分专门化一个方法,您可以部分专门化整个 class,但需要一些重复。
由于您可以使用 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 之前)中标记 dipatching,其优点是允许成员初始化器列表:
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;
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.