问题描述
类模板:
template <class X,class Y > class MyTemplate;
我想部分特化这个类,以便当 X 是常量类型时,Y 是 int
并且如果我创建一个对象,则选择部分特化代码,例如:
MyTemplate<sometype const> var;
而如果 X 是非常量类型,则 Y 是 double
并且如果我创建一个对象,则选择部分特化代码,例如:
MyTemplate<sometype> var;
这在 C++11 中可行吗?如果是这样,如何?如果没有,这在带有概念和要求的 C++20 中是否可行?
解决方法
部分专业化(可能有促成因素):
template <class X,class Y,typename Enabler = void> class MyTemplate;
template <class X>
class MyTemplate<const X,int>
{
// ...
};
template <class X>
class MyTemplate<X,double,std::enable_if_t<!std::is_const_v<X>>>
{
// ...
};
//...
将 C++14 X_t<T>
/X_v<T>
替换为 typename X<T>::type
/X<T>::value
为 C++11。
你真的不需要为此使用部分专业化。你可以写:
template <typename X,typename Y =
typename std::conditional<std::is_const<X>::value,int,double>::type>
class MyTemplate;
这是一个demo