MSVC SFINAE:替代不会失败
MSVC SFINAE: Substitution does not fail
我试图做一种"has_member"。使用 Clang(对于 msvc(效果很好(我得到 0, 1(,但使用 MSVC 它不能(我得到 1, 1(。
这是我的代码
template<typename T>
using void_t = void;
namespace detail {
template<typename AlwaysVoid, template<typename...> typename Operator, typename ...Args>
struct _is_valid : std::false_type {};
template<template<typename...> typename Operator, typename ...Args>
struct _is_valid<void_t<Operator<Args...>>, Operator, Args...> : std::true_type { using type = Operator<Args...>; };
}
template<template<typename ...> typename Operator, typename ...Args>
using is_valid = detail::_is_valid<void, Operator, Args...>;
template<typename T>
using _has_push_back = decltype(std::declval<T>().push_back(std::declval<typename T::value_type>()));
template<typename T>
using has_push_back = is_valid<_has_push_back, T>;
int main() {
std::cout << has_push_back<float>::value << " " << has_push_back<std::vector<float>>::value << std::endl;
getchar();
return 0;
}
恕我直言,Operator<Args...>
不会失败detail::_is_valid
.但我不明白如何使其对 MSVC 有效。
我正在使用Visual Studio 2017
你应该尝试:
template<typename T> struct make_void {
using type = void;
};
template<typename T>
using void_t = typename make_void<T>::type;
有关is_detected
的信息也可能有所帮助。
Visual Studio在SFINAE很糟糕。尽管他们声称已经改善了这种情况,但我编写的大多数(如果不是全部(SFINAE 代码(尽管它并不多(无法工作甚至编译,即使 Clang 和 GCC 处理相同的代码就可以了。
将所有失败的代码发送给Microsoft这样您就有更大的机会修复它。
相关文章:
- 如果没有malloc,链表实现将失败
- 模板参数替换失败,并且未完成隐式转换
- 构造函数SFINAE和继承在clang中失败
- C++ 带有 decltype 的 SFINAE:替换失败成为错误?
- SFINAE - 如果更复杂的功能失败,则回退到默认功能
- MSVC SFINAE:替代不会失败
- 在模板参数中评估 constexpr 时 SFINAE 失败
- SFINAE 序列化共享指针失败
- 使用ENABLE_IF和SFINAE时,功能参数类型扣除(std容器,例如向量)失败
- SFINAE使用演绎,但用替换失败
- Sfinae 类型特征会自动扣除失败
- 模板参数推导失败,SFINAE
- 类模板中的 typedef 的 SFINAE 失败是指另一个类模板中的 typedef
- 变量args SFINAE默认构造函数在clang中工作,但在Visual Studio 2015中失败
- is_container trait在std::set SFINAE问题上失败
- 是否有一种方法可以使用SFINAE来确定对模板化函数的调用是否会由于所提供的类型而失败
- 替换失败不是static_cast的错误(SFINAE)问题
- C++为什么 SFINAE 仅使用类模板参数会失败
- 在存在泛型构造函数的情况下,对三元运算符的SFINAE失败
- 带有继承历史的CRTP插件自动注册(尝试使用SFINAE,但失败)