我想专门针对某些类的类,例如基于std::is_arithmetic。尽管编译器没有“看到”我基于“enable_if”的专业,而是选择了原理/主模板。你能帮我这个忙吗...
以下是使用g++ 4.8编译后的代码和输出片段

#include < iostream >
#include < type_traits >
#include < string >

template < typename T1, typename T2 = void >
struct TestT
{
    static const bool is_int = false;
    static const bool is_str = false;
};

template < typename T>
struct TestT < T,
       std::enable_if< std::is_arithmetic<t>::value, T >::type >
{
    static const bool is_int = true;
    static const bool is_str = false;
};

template < typename T>
struct TestT < std::string, T >
{
    static const bool is_int = false;
    static const bool is_str = true;
};

class enum TestE
{
    Last
};

int main(int argc, char* argv[])
{
    std::cout << "Enum is_int: " << TestT<TestE>::is_int
              << ", is_str: " << TestT<TestE>::is_str << std::endl;
    std::cout << "string is_int: " << TestT<std::string>::is_int
              << ", is_str: " << TestT<std::string>::is_str << std::endl;
    std::cout << "int is_int: " << TestT<int>::is_int
              << ", is_str: " << TestT<int>::is_str << std::endl;
    return 0;
}

上面的输出是:



我真的很感谢您的帮助,并在此先感谢您

最佳答案

您需要保留第二个参数(别名为::type的类型)为未指定或为void,以使其与主模板的默认参数匹配:

struct TestT<T,
       std::enable_if<std::is_arithmetic<T>::value>::type>

您还需要在typename语句之前添加std::enable_if,或使用std::enable_if_t(并省略::type):

struct TestT<T, std::enable_if_t<std::is_arithmetic<T>::value>>

第二个特化也是如此:

template<>
struct TestT<std::string>
{
    static const bool is_int = false;
    static const bool is_str = true;
};

最后,在此特化范围内,is_int应该设置为true:

template<typename T>
struct TestT<T, std::enable_if_t<std::is_arithmetic<T>::value>>
{
    static const bool is_int = true;
    static const bool is_str = false;
};

Live Demo

更好的版本可能是保留单个特化,并使用std::is_same测试int和类型特征测试字符串:

template<class T>struct is_string:std::false_type{};
template<>struct is_string<std::string>:std::true_type{};
template<std::size_t N>struct is_string<char const(&)[N]>:std::true_type{};
template<>struct is_string<char const*>:std::true_type{};
template<>struct is_string<char const*const>:std::true_type{};
template<>struct is_string<char const*volatile>:std::true_type{};
// on and on...

template<typename T>
struct TestT
{
    static const bool is_int = std::is_same<T, int>();
    static const bool is_str = is_string<T>();
};

关于c++ - 为什么编译器不选择基于enable_if的特化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30655659/

10-13 07:11