MSVC SFINAE:替补不会失败

时间:2017-07-12 21:26:45

标签: c++ sfinae

我正试图做一个“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

2 个答案:

答案 0 :(得分:3)

你应该尝试:

template<typename T> struct make_void {
    using type = void;
};

template<typename T>
using void_t = typename make_void<T>::type;

is_detected上的信息也可能会有所帮助。

答案 1 :(得分:2)

Visual Studio在SFINAE很糟糕。尽管他们声称已经改善了这种情况,但即使不是所有我编写的SFINAE代码(虽然它并不多)都无法工作甚至编译,即使Clang和GCC处理相同的代码就好了。

将所有失败的代码发送给Microsoft,以便您更有可能将其修复。