gpt4 book ai didi

c++ - 可以用 C++ 制作 "future-safe"比较运算符吗?

转载 作者:可可西里 更新时间:2023-11-01 15:47:58 24 4
gpt4 key购买 nike

大家好

是否可以在 C++ 中设计一个面向 future 的比较运算符 (==)?

我遇到的问题是我们有一个包含多个成员的类。我们有一个比较运算符来验证对象的 instance-1 是否与 instance-2 具有相同的值。

即我们可以做到

class blarg {
.....
};

.....

blarg b1(..initializers...);
blarg b2 = b1;

if (b1 == b2) {
... then do something ....
}

但是,我有一个同事向类(class)添加了一个新成员,但未能更新比较运算符。这导致了我们花了一段时间才弄清楚的问题。

是否有编码实践,我的意思是其他代码审查(我们失败了)或编码方法、设计、模板、魔 bean ,任何可能帮助避免这种情况?

我的第一 react 是使用memcmp 命令。然而,在阅读了“Comparing structures in C vs C++”的堆栈溢出条目后,我发现这可能是有问题的,因为 C++ 类不仅包含内部成员数据。

其他人如何处理这个问题?

预先感谢您的帮助。

最佳答案

嗯,显而易见的解决方案是在扩展原始类时更加小心。 :) “更加小心”包括诸如代码审查之类的事情,但显然这并不是万无一失的。

因此,从哲学的角度而不是技术的角度解决这个问题通常可以提供洞察力。这种情况下的哲学是成为一个偏执的程序员。假设您今天编写的代码将在几个月或几年后被一些傻子破坏。 (根据下面@Noah 的评论进行编辑:通常情况下,那个傻子就是我自己。作为一个偏执的程序员,可能比其他任何人都更能保护我免受我自己的伤害。)如果你能做些什么来确保当nitwit 确实破坏了您的代码,但在产品发货之前出现了一些故障,这会有所帮助。

我喜欢使用的两件事是静态断言和单元测试。可以在您的 operator== 代码中使用静态断言来验证您的类的 sizeof 是否符合您的预期。例如:

bool MyClass::operator==(const MyClass& rhs) const
{
static_assert(sizeof(MyClass) == sizeof(foo_) + sizeof(bar_))
...
}

...其中 foo_bar_ 是成员变量。当类的大小发生变化时,这将中断编译。

因为静态断言通常采用模板类的形式,当表达式为假时将无法编译。这可能写起来有点棘手(但这是一个有趣的练习——考虑一下如果您尝试将 char test_[0] 成员添加到类中会发生什么)。幸运的是,这个轮子已经被发明出来了。参见 Boost例如,我认为新的 MSVC 编译器也附带了一个。

关于c++ - 可以用 C++ 制作 "future-safe"比较运算符吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4511891/

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