元编程 C/C++:如何避免在此处使用宏?

Metaprogramming C/C++: how can I avoid using macros here?

我正在编写一个 CheckedPtr class 来练习异常处理(Stroustrup,TC++PL 练习,第 4 版,问题 14.1)。我想重载一堆运算符,而执行此操作的代码几乎相同。我正在使用宏来避免过于重复,但我知道宏很危险,所以我想知道是否存在更好的方法。

这是我的代码 -- 显示的部分是我在名为 CheckedPtr 的 class 中定义的部分。 and/or 没有宏,我能做得更好吗?我宁愿不手动编写所有这些函数,即使这意味着使用宏会有一些风险。

// This is relatively dangerous.
#define CHECKED_PTR_OVERLOAD_COMPARATOR(OP)            \
    template<typename Ptr>                             \
    bool operator OP(Ptr& p) { return pos OP &*p; }

    CHECKED_PTR_OVERLOAD_COMPARATOR(==)
    CHECKED_PTR_OVERLOAD_COMPARATOR(<)
    CHECKED_PTR_OVERLOAD_COMPARATOR(>)
    CHECKED_PTR_OVERLOAD_COMPARATOR(<=)
    CHECKED_PTR_OVERLOAD_COMPARATOR(>=)

#undef CHECKED_PTR_OVERLOAD_COMPARATOR

正如评论者已经说过的,不要为此使用宏。如果你想有一个最小的实现但一个完整的集合比较功能,我相信 Boost.Operators 是你最好的选择。我链接到的页面上显示的示例是:

struct animal : public boost::less_than_comparable<animal>
{
  std::string name;
  int legs;

  animal(std::string n, int l) : name{std::move(n)}, legs{l} {}

  bool operator<(const animal &a) const { return legs < a.legs; }
};

其中实现单个 operator< 函数并让动物 class 从 boost::less_than_comparable<animal> 派生出运算符 ><=>=

Whosebug上还有其他相关问题。见

how to use std::rel_ops to supply comparison operators automatically?

How do boost operators work?