我正在测试班模板SFINAE。
template<typename T, typename...Types>
using enable_if_class = T;
template<typename T, typename...Types>
struct enable_if_test;
template<typename T>
struct enable_if_test<T, enable_if_class<T, typename std::enable_if<std::is_const<T>::value, int>::type>> {
enable_if_test() {
std::cout << "const version!\n";
}
};
template<typename T>
struct enable_if_test<T, enable_if_class<T, typename std::enable_if<!std::is_const<T>::value, int>::type>> {
enable_if_test() {
std::cout << "nonconst version!\n";
}
};
上面的代码在g ++上编译,但是在clang ++和Visual Studio上出错。当代码更改为:
template<typename T, typename...Types>
using enable_if_class = T;
template<typename T, typename...Types>
struct enable_if_test;
template<typename T>
struct enable_if_test<T, enable_if_class<void, typename std::enable_if<std::is_const<T>::value, int>::type>> {
enable_if_test() {
std::cout << "const version!\n";
}
};
template<typename T>
struct enable_if_test<T, enable_if_class<void, typename std::enable_if<!std::is_const<T>::value, int>::type>> {
enable_if_test() {
std::cout << "nonconst version!\n";
}
};
这次只有g ++出错。所以这是我的问题,这是编译器错误还是我的代码非法?如果这是编译器错误,是否有任何原因导致此错误?
似乎是clang / msvc的错误,类似于1558发现的CWG(std::void_t
),使用:
std::void_t
使所有编译器感到高兴:
template<typename T, typename...Types>
struct enable_if_class_impl
{
using type = T;
};
template<typename T, typename...Types>
using enable_if_class = typename enable_if_class_impl<T, Types...>::type;