我有以下代碼來確定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