是否可以使用std :: enable_if来选择成员模板专门化?

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.那么如何根据类型特征专门化模板成员呢?

nij*_*sen 4

我认为没有理由专门研究这里,在我看来,重载该函数似乎就足够了。

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