gpt4 book ai didi

C++ 相等性测试 'Object'

转载 作者:太空宇宙 更新时间:2023-11-04 15:42:37 25 4
gpt4 key购买 nike

在 C# 中,可以测试任何对象与任何对象的相等性,因为一切都继承自 Object。

在 C++ 中,情况并非如此。我想重载传入任何未知类的 == 运算符,并在运行时检查不平等,而不是编译时。 (我收到错误 binary '!=' : no operator found which takes a left-hand operand of type)。

现在我想要这个用于 TDD。

我该怎么做?

最佳答案

In C# it's possible to test equality for any object against any object since everything inherits from Object.

这完全是错误的。虽然每个类都继承了一个 Equals 方法,但这个方法不一定会做任何有意义的事情,除非它被覆盖。

您可以在 C++ 中实现相同的效果,但这是非常糟糕的做法,可能不是您想要的:

template <typename A, typename B>
bool equals(A const& a, B const& b) {
return reinterpret_cast<char const*>(&a) == reinterpret_cast<char const*>(&b);
}

…这将是您的后备案例(实现引用标识1)。现在您可以在类型实现适当运算符的地方添加一个(通过 SFINAE):

template <typename T>
auto equals(T const& a, T const& b) -> decltype(a == b) {
return a == b;
}

但是,重申一下,这既不建议也通常没有帮助。这主要是荒谬的——要么你已经知道(以及如何)你可以比较你的对象,要么这种比较从一开始就没有意义。

C# 的设计绝对糟糕。根本没有通用的“相等”概念,C# 的 Object 类型在这方面被过度指定。


1 对于 struct,C# 实现了成员相等性,这可以说更有意义,但同样通常不是我们想要的,而且启动效率非常低(因为它使用反射)。

关于C++ 相等性测试 'Object',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20971390/

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