    #include <type_traits>

    template<typename T, typename = void>
    struct is_equality_comparable : std::false_type
    { };

    template<typename T>
    struct is_equality_comparable<T,
        typename std::enable_if<
            true,
            decltype((std::declval<T>() == std::declval<T>()), (void)0)
            >::type
        > : std::true_type
    {
    };

    struct X { };
    struct Y { };

    bool operator == (X const&, X const&) { return true; }

    int main()
    {
        static_assert(is_equality_comparable<int>::value, "!");
        static_assert(is_equality_comparable<X>::value, "!");
        static_assert(is_equality_comparable<Y>::value, "!");
    }
