【发布时间】:2011-04-06 07:42:19
【问题描述】:
看到this question后,我的第一个想法是定义泛型等价和关系运算符是微不足道的:
#include <cstring>
template<class T>
bool operator==(const T& a, const T& b) {
return std::memcmp(&a, &b, sizeof(T)) == 0;
}
template<class T>
bool operator<(const T& a, const T& b) {
return std::memcmp(&a, &b, sizeof(T)) < 0;
}
using namespace std::rel_ops 将变得更加有用,因为它会被运算符 == 和 < 的默认实现完全通用。显然,这不会执行成员比较,而是按位比较,就好像该类型仅包含 POD 成员一样。这与 C++ 生成复制构造函数的方式并不完全一致,例如,确实执行成员复制。
但我想知道上面的实现是否确实安全。这些结构自然会具有相同的包装,属于相同的类型,但填充的内容是否保证相同(例如,用零填充)?是否有任何原因或情况导致这不起作用?
【问题讨论】:
-
您为什么要这样做?如果没有这个,如果你没有相等或小于运算符,你会得到一个非常方便的编译错误。有了这个,编译错误就消失了,你默默地拥有了可能是错误的运算符。您正在以不易被发现的方式小心地创建错误。
-
@David:我几乎可以肯定不会在实际代码中使用它,但推测一下也无妨。
-
从好的方面来说,如果你刚刚被解雇,我认为这是对你的公司进行报复的好方法。比
#define NULL rand()%1000 ? 0:1更好 -
@DumbCoder:这基本上就是我正在寻找的答案。发布它,我会接受。
标签: c++ operators operator-overloading