return 类型的方法模板特化
method template specialization by return type
我有一个 class 模板方法,参数定义了 return 类型。其他一切的默认构造函数都可以,但对于 bool,我希望该方法为 return true。我正在尝试将其专门化为以下代码,但这无法编译。
class Foo {
template <class T>
T method() {
...
return T();
}
template<>
bool method() {
...
return true;
}
};
我怎样才能做到这一点?
您不能在 class 范围内专攻。根据C++标准,
14.7.3/2 An explicit specialization shall be declared in a namespace enclosing the specialized template.
因此您应该在命名空间范围内专门化模板成员函数,
template<> // this should be outside the primary template class definition
bool Foo::method() {
return true;
}
您可以使用 SFINAE 来达到预期的效果,这在技术上将 "specialization"(正如其他答案所解释的那样不可能)变成过载:
template <class T>
typename std::enable_if<
! std::is_same< T, bool >::value,
T
>::type
method() {
...
return T();
}
template <class T>
typename std::enable_if<
std::is_same< T, bool >::value,
T
>::type
method() {
...
return true;
}
上面是C++11,C++14你甚至可以用std::enable_if_t
来缩短它。
我有一个 class 模板方法,参数定义了 return 类型。其他一切的默认构造函数都可以,但对于 bool,我希望该方法为 return true。我正在尝试将其专门化为以下代码,但这无法编译。
class Foo {
template <class T>
T method() {
...
return T();
}
template<>
bool method() {
...
return true;
}
};
我怎样才能做到这一点?
您不能在 class 范围内专攻。根据C++标准,
14.7.3/2 An explicit specialization shall be declared in a namespace enclosing the specialized template.
因此您应该在命名空间范围内专门化模板成员函数,
template<> // this should be outside the primary template class definition
bool Foo::method() {
return true;
}
您可以使用 SFINAE 来达到预期的效果,这在技术上将 "specialization"(正如其他答案所解释的那样不可能)变成过载:
template <class T>
typename std::enable_if<
! std::is_same< T, bool >::value,
T
>::type
method() {
...
return T();
}
template <class T>
typename std::enable_if<
std::is_same< T, bool >::value,
T
>::type
method() {
...
return true;
}
上面是C++11,C++14你甚至可以用std::enable_if_t
来缩短它。