gpt4 book ai didi

c++ - EqualityComparable 特质解释

转载 作者:行者123 更新时间:2023-11-28 04:39:00 26 4
gpt4 key购买 nike

阅读 C++ 模板第二版的第 22 章,我试图理解 EqualityComparable 特性的实现。但我无法理解编译器如何决定是否激活回退。

除此之外还有两个只声明了程序编译运行的函数。这对我来说很奇怪。

这是代码。头文件IsEqualityComparable.hpp

#include <utility>        // for declval()
#include <type_traits> // for true_type and false_type

template<typename T>
class IsEqualityComparable
{
private:
// test convertibility of == and ! == to bool:
static void* conv(bool); // to check convertibility to bool
template<typename U>
static std::true_type test(decltype(conv(std::declval<U const&>() ==
std::declval<U const&>())),
decltype(conv(!(std::declval<U const&>() ==
std::declval<U const&>())))
);
// fallback:
template<typename U>
static std::false_type test(...);
public:
static constexpr bool value = decltype(test<T>(nullptr,
nullptr))::value;
};

源文件如下

#include <iostream>
#include <exception>
#include <utility>
#include <functional>
#include "isequalitycomparable.hpp"

template<typename T,
bool EqComparable = IsEqualityComparable<T>::value>
struct TryEquals
{
static bool equals(T const& x1, T const& x2) {
std:: cout << "IsEqualityComparable equals::"<<std::endl;
return x1 == x2;
}
};
class NotEqualityComparable : public std::exception
{
};
template<typename T>
struct TryEquals<T, false>
{
static bool equals(T const& x1, T const& x2) {
std:: cout << "Throw::"<<std::endl;
throw NotEqualityComparable();
}
};
void foo(int)
{
}
void bar(int)
{
}
class A
{
public:
A() = default;
friend bool operator ==(A a1 , A a2)
{
return true;
}
};
int main()
{
std:: cout << "Enter" << std::endl;
std::function<void(int)> f = foo;
std::function<void(int)> f2 = f;
std:: cout << "Enter" << std::endl;
//std:: cout << "Check::"<<
//TryEquals<std::function<void(int)>>::equals(f,f2) << std::endl;
A a1;
A a2;
std:: cout << "Check::"<< TryEquals<A>::equals(a1,a2) << std::endl;
return 0;
}

TryEquals<std::function<void(int)>>::equals(f,f2)

抛出异常,因为运算符 == 没有实现但是

TryEquals<A>::equals(a1,a2)  

返回 1,因为类 A 有一个运算符 ==。

在这一点上,我需要帮助以了解转换和测试 是如何工作的。

此外,

static constexpr bool value = decltype(test<T>(nullptr,
nullptr))::value

有效吗?

我对这个表达感到困惑

decltype(test<T>(nullptr,nullptr))::value. 

最佳答案

不需要定义函数,因为它们实际上从未被调用过。

decltypean Unevaluated context它找出函数的返回类型,但从不尝试计算返回

在这种情况下,它与 sfinae 组合在一起,因此如果 decltype 无法确定 == 的返回类型(可能是因为运算符不存在),test 的重载将被忽略。然后将选择 test(...)

这利用了 ... 是参数类型的绝对最差匹配这一事实,因此只有在没有其他重载可用时才会使用它(因此是“回退”)。

顺便说一句,std::declval也从未定义过。

关于c++ - EqualityComparable 特质解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50664790/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com