gpt4 book ai didi

c++ - 我的 SFINAE 有什么问题? : Testing Supported Operators

转载 作者:行者123 更新时间:2023-12-02 10:23:43 25 4
gpt4 key购买 nike

这是有问题的代码:

template <typename=std::enable_if_t<supports_v<std::equal_to<>, T>> >
bool alreadyValue(const T &value) { return this->value == value; }
// alternate case if T does not support equals operator
bool alreadyValue(const T &value) { return false; }
这是我的支持定义:
template<typename F, typename... T, typename = decltype(std::declval<F>()(std::declval<T>()...))>
std::true_type supports_test(const F&, const T&...);
std::false_type supports_test(...);

template<typename> struct supports;
template<typename F, typename... T> struct supports<F(T...)>
: decltype(supports_test(std::declval<F>(), std::declval<T>()...)){};

template<typename F, typename T>
constexpr bool supports_v = supports<F(T, T)>::value;

template<typename F, typename... T>
constexpr bool all_supports_v = (supports<F(T, T)>::value && ...);
现在,MSVC 19.20 对这段代码没有任何问题。
但是 GCC 9.1 提示说:

In substitution of 'template<bool _Cond, class _Tp> using enable_if_t = typename std::enable_if::type [with bool _Cond = supports_v<std::equal_to<void>, A>; _Tp = void]':

error: no type named 'type' in 'struct std::enable_if<false, void>'


由于 SFINAE 知道“结构中没有类型”应该静默失败,因为它不是错误,我的问题是我做错了什么吗?
这是我正在使用的示例:
  • (GCC 9.1) https://godbolt.org/z/LNfjyp
  • (MSVC 19.20) https://godbolt.org/z/wJqXFq
  • 最佳答案

    @rubenvb声明和@Mike Spencer提到, enable_if 不在未评估的上下文中,因为没有依赖于函数的泛型类型。所以没有SFINAE。

    作为一种解决方案,我改为将该函数构建为通用支持函数:

    template<typename T, bool=supports_v<std::equal_to<>, T>>
    struct is_equal_t;
    template<typename T>
    struct is_equal_t<T, true> {
    bool operator() (const T& x, const T& y) const { return x==y; }
    };
    template<typename T>
    struct is_equal_t<T, false> {
    bool operator() (const T& x, const T& y) const { return false; }
    };

    template<typename T>
    bool is_equal(const T& x, const T& y) {
    static is_equal_t<T> cmp;
    return cmp(x, y);
    }

    关于c++ - 我的 SFINAE 有什么问题? : Testing Supported Operators,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56550980/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com