如何避免C ++中operator ==实现中的错误?

我经常有类提供简单的逐个成员的比较:

class ApplicationSettings
{
public:
   bool operator==(const ApplicationSettings& other) const;
   bool operator!=(const ApplicationSettings& other) const;

private:
   SkinType m_ApplicationSkin;
   UpdateCheckInterval m_IntervalForUpdateChecks;
   bool m_bDockSelectionWidget;
   // Add future members to operator==
};

bool ApplicationSettings::operator==(const ApplicationSettings& other) const
{
   if (m_ApplicationSkin != other.m_ApplicationSkin)
   {
      return false;
   }

   if (m_IntervalForUpdateChecks != other.m_IntervalForUpdateChecks)
   {
      return false;
   }

   if (m_bDockSelectionWidget != other.m_bDockSelectionWidget)
   {
      return false;
   }

   return true;
}

bool ApplicationSettings::operator!=(const ApplicationSettings& other) const;
{
   return ( ! operator==(other));
}

鉴于此时C ++没有提供任何生成运算符的构造==,除了在数据成员之下添加的注释之外,是否有更好的方法来确保将来的成员成为比较的一部分?


它并没有捕捉到每一种情况,令人讨厌的是它依赖于编译器和平台,但是一种方法是基于类型的sizeofstatic_assert

static_assert<sizeof(*this) == <n>, "More members added?");

其中<n>是一个constexpr

如果引入新成员,那么通常会发生sizeof变化,并且会导致编译时失败。


仅仅关注这方面的技术方面,您可以利用标准库std::tuple类型重载operator==来进行成员明智的比较。 如果你不介意在其他地方牺牲简单的成员访问权限,你可以将你的成员包装在一个元组中。 像这样的东西:

#include <tuple>

class ApplicationSettings
{
public:
   bool operator==(const ApplicationSettings& other) const;
   bool operator!=(const ApplicationSettings& other) const;

private:

   enum m {
     ApplicationSkin, 
     IntervalForUpdateChecks,
     bDockSelectionWidget
   };

   std::tuple<
     SkinType,
     UpdateCheckInterval,
     bool
   > m_Data;
};

现在实现比较运算符是不言而喻的:

bool ApplicationSettings::operator==(const ApplicationSettings& other) const {
  m_Data == other.m_Data;
}

当然,牺牲是其他成员函数需要通过std::get<m::ApplicationSkin>(m_Data)来访问其他成员。 这可能会引起一些少见的眉毛。

链接地址: http://www.djcxy.com/p/73771.html

上一篇: How to avoid mistakes in operator== implementations in C++?

下一篇: Safe to use the compiler generated assignment operator?