Dan*_*ger 9 c++ templates template-specialization c++11
给出一个类声明
class A {
template <typename T> T foo();
};
Run Code Online (Sandbox Code Playgroud)
我想专门A::foo研究各种类型(int,...)和类型类(POD,非POD)T.不幸的是,我似乎无法std::enable_if用于后者.以下内容无法编译:
template <> int A::foo<int>(); // OK
template <typename T>
typename std::enable_if<is_pod<T>::value, T>::type foo(); // <<<< NOT OK!
template <typename T>
typename std::enable_if<!is_pod<T>::value, T>::type foo(); // <<<< NOT OK!
Run Code Online (Sandbox Code Playgroud)
问题可能是因为这些std::enable_if<...>东西是函数签名的一部分,而且我没有在里面声明任何这样的成员A.那么如何根据类型特征专门化模板成员呢?
我认为没有理由专门研究这里,在我看来,重载该函数似乎就足够了。
struct A
{
template <typename T>
typename std::enable_if<std::is_integral<T>::value, T>::type foo()
{
std::cout << "integral" << std::endl;
return T();
}
template <typename T>
typename std::enable_if<!std::is_integral<T>::value, T>::type foo()
{
std::cout << "not integral" << std::endl;
return T();
}
}
Run Code Online (Sandbox Code Playgroud)
当检查 POD 或没有 POD 时,您只有这两个选择,因此不需要更通用的函数(并且不允许,因为它会产生歧义)。您还需要更多吗?您可以在 的帮助下检查显式类型而无需专门化std::enable_if<std::is_same<int, T>::value, T>::type。
| 归档时间: |
|
| 查看次数: |
4707 次 |
| 最近记录: |