Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;11相等可比类型的静态断言?_C++_Templates_C++11_Equality_Static Assert - Fatal编程技术网

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_compariable:std::true_type{};请注意,对模板类型参数执行
static\u assert
有时是一个次优的想法。您通常希望匹配失败,这需要SFINAE,而不是编译失败,而静态断言则需要SFINAE。