template<typename A, typename B, typename = void>
struct is_equal_comparable : std::false_type {};
template<typename A, typename B>
struct is_equal_comparable<A, B,
std::void_t<decltype(std::declval<A>() == std::declval<B>())>>
: std::true_type {};
template<typename A, typename B, typename = void>
struct is_string_comparable : std::false_type {};
template<typename A, typename B>
struct is_string_comparable<A, B,
std::void_t<
decltype(std::declval<A>().compare(std::declval<B>())),
decltype(&A::c_str)>
> : std::true_type {};
is_equal_comparable<int, int> 这个就很舒服了。
把其中的
std::declval<A>() == std::declval<B>()
decltype(std::declval<A>().compare(std::declval<B>()))
decltype(&A::c_str)
用各种表达式替换就可以各种检测。
std::void_t虽然是c++17新加的,但其实可以复制其实现到c++14中使用