【发布时间】:2017-08-09 11:36:35
【问题描述】:
我想出了一个想法来定义一个通用的比较运算符,它适用于任何类型,为了它的乐趣。
#include <cstring>
#include <iostream>
class A
{
public:
A(int id) : id(id) {}
private:
int id;
};
template <class T>
inline bool operator==(const T& a, const T& b)
{
return memcmp(&a, &b, sizeof(a)) == 0; // implementation is unimportant (can fail because of padding)
}
int main()
{
std::cout << (A(10) == A(10)) << std::endl; // 1
std::cout << (A(10) == A(15)) << std::endl; // 0
}
我认为这可能有助于解决 c++ 中缺少默认比较运算符的问题。
这是一个糟糕的主意吗?我想知道这样做是否会在某些情况下破坏任何东西?
【问题讨论】:
-
“实施不重要” 不,不是。它将编译错误转换为运行时错误。这很糟糕。
-
这与
reinterpret_cast一样糟糕,无法消除编译器错误。没有定义比较运算符的类型出于各种原因这样做。你用正确的、定义明确的代码来代替一些很少有用的语法糖。 -
@Bathsheba 提示某人为他们的类型重载了一元
operator&。 -
如果您的对象中有引用或指针,您将比较地址而不是值
-
而且具有可变成员的类也将受到怀疑。由于
const方法可以更改可变成员,但不应使相等对象不相等,因此相等不能依赖于那些mutable成员。