我有以下代码来确定2种类型是否具有可比性。检查2种类型是否具有可比性
template<typename T, typename U, typename = std::void_t<>>
struct is_comparable
: std::false_type
{};
template<typename T, typename U>
struct is_comparable<T, U, std::void_t<decltype((std::declval<T>() == std::declval<U>()))>>
: std::true_type
{};
这是一种可以接受的方式来实现我想要做的事吗?你能看到这个设计有什么问题吗?
编辑
保持cdhowie的评论和亨利面机的记答案,这是现在的代码的外观。
namespace meta
{
template<typename T, typename U, typename = std::void_t<>>
struct has_equal_to_operator
: std::false_type
{};
template<typename R, typename T, typename U, typename = std::void_t<>>
struct has_equal_to_operator_r
: std::false_type
{};
template<typename T, typename U, typename = std::void_t<>>
struct has_nothrow_equal_to_operator
: std::false_type
{};
template<typename R, typename T, typename U, typename = std::void_t<>>
struct has_nothrow_equal_to_operator_r
: std::false_type
{};
template<typename T, typename U>
struct has_equal_to_operator<T, U, std::void_t<decltype(std::declval<T>() == std::declval<U>())>>
: std::true_type
{};
template<typename R, typename T, typename U>
struct has_equal_to_operator_r<R, T, U, std::void_t<decltype(std::declval<T>() == std::declval<U>())>>
: std::is_convertible<decltype(std::declval<T>() == std::declval<U>()), R>
{};
template<typename T, typename U>
struct has_nothrow_equal_to_operator<T, U, std::void_t<decltype(std::declval<T>() == std::declval<U>())>>
: std::bool_constant<noexcept(std::declval<T>() == std::declval<U>())>
{};
template<typename R, typename T, typename U>
struct has_nothrow_equal_to_operator_r<R, T, U, std::void_t<decltype(std::declval<T>() == std::declval<U>())>>
: std::bool_constant<(noexcept(std::declval<T>() == std::declval<U>()) && std::is_convertible_v<decltype(std::declval<T>() == std::declval<U>()), R>)>
{};
template<typename T, typename U>
inline constexpr auto has_equal_to_operator_v = has_equal_to_operator<T, U>::value;
template<typename R, typename T, typename U>
inline constexpr auto has_equal_to_operator_r_v = has_equal_to_operator_r<R, T, U>::value;
template<typename T, typename U>
inline constexpr auto has_nothrow_equal_to_operator_v = has_nothrow_equal_to_operator<T, U>::value;
template<typename R, typename T, typename U>
inline constexpr auto has_nothrow_equal_to_operator_r_v = has_nothrow_equal_to_operator_r<R, T, U>::value;
}
我澄清'is_equality_comparable'因为还有其他种类的比较(不平等,关系...)。 – cdhowie