遵循Template class type-specific functions,如何自定义我的模板代码以不为某些类型编译?如果问题不清楚,请查看此示例。
///** template class ***/
template<typename T>
class testClass{
testClass();
T parameter;
}
template<typename T>
void testClass<T>::print(){cout<<parameter.value<<endl;}
上面的类应该适用于以下类型:
//** types file **/
class paramtype1{
int value;
}
class paramtype2{
int value;
}
class paramtype3{
}
如您所见,paramtype3
没有value
,所以我收到一个编译错误,说value
未定义。我知道如果我想为某种类型专门化一个模板类函数,我需要做:
template<>
void testClass<paramtype1>::print(){cout<<parameter.value<<endl;}
但是,有没有什么办法可以反过来,只排除某些类型?
如果你想启用/禁用完整的类/结构,你可以使用 SFINAE 和部分专业化。
下面是一个 C++17 的例子
template <typename T, typename = void>
struct testClass;
template <typename T>
struct testClass<T, std::void_t<decltype(T::value)>>
{
testClass()
{ };
T parameter;
void print()
{ std::cout << parameter.value << std::endl; }
};
如果您只想启用/禁用该print()
功能,则必须对其进行模板化;举例
template <typename U = T>
std::void_t<decltype(U::value)> print()
{ std::cout << parameter.value << std::endl; }
或者也
template <typename U = T>
std::void_t<decltype(U::value), std::enable_if_t<std::is_same_v<U, T>>>
print()
{ std::cout << parameter.value << std::endl; }
如果你想确保没有人可以“劫持”解释模板类型调用的方法
testClass<paramtype3>{}.print<paramtype1>():
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句