C++ C++;11相等可比类型的静态断言?
如何C++ C++;11相等可比类型的静态断言?,c++,templates,c++11,equality,static-assert,C++,Templates,C++11,Equality,Static Assert,如何static\u断言模板类型在C++11中是平等可比的概念?您可以使用以下类型特征: #include <type_traits> template<typename T, typename = void> struct is_equality_comparable : std::false_type { }; template<typename T> struct is_equality_comparable<T, typename s
static\u断言
模板类型在C++11中是平等可比的概念?您可以使用以下类型特征:
#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
{
};
#包括
模板
结构是可比较的:std::false\u类型
{ };
模板
结构是\u相等\u可比较::类型
>:std::true\u类型
{
};
您可以通过以下方式测试:
struct X { };
struct Y { };
bool operator == (X const&, X const&) { return true; }
int main()
{
static_assert(is_equality_comparable<int>::value, "!"); // Does not fire
static_assert(is_equality_comparable<X>::value, "!"); // Does not fire
static_assert(is_equality_comparable<Y>::value, "!"); // Fires!
}
struct X{};
结构Y{};
布尔运算符==(X常量&,X常量&){return true;}
int main()
{
静态\u断言(是否相等\u可比较::值“!”;//不激发
静态\u断言(是否相等\u可比较::值“!”;//不激发
静态断言(是否相等?是否可比较::值“!”;//激发!
}
这里有一个.小的修正:如果t不是默认可构造的,它将无法正常工作-将其设置为
std::declval()
而不是t()
@jrok:绝对正确。我不知道我怎么能忽视这一点。严格地说,这不是100%的等式可比概念检查,因为交换性和传递性需求没有检查。但由于它们不能在编译时检查,我想这没什么大不了的。@christorc:无论你选择哪个(declval
或declval
),总会有一个“非惯用”的特征无法正确识别。如果我选择了declval
,则带有运算符==
的类型采用可修改的左值引用将被视为非相等可比类型。诚然,通过可修改的左值引用进行获取毫无意义,但通过右值引用进行获取(甚至更少)也是如此。std::enable_if是多余的。专门化可以简化为模板结构is_equality_compariablestatic\u assert
有时是一个次优的想法。您通常希望匹配失败,这需要SFINAE,而不是编译失败,而静态断言则需要SFINAE。