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

时间:2015-08-11 02:36:28

标签: c++ macros metaprogramming

我正在写一个CheckedPtr类来练习异常处理(Stroustrup,TC ++ PL Exercises,4th Ed。,issue 14.1)。我想重载一堆运算符,这样做的代码几乎是一样的。我正在使用宏来避免过于重复,但我知道宏是危险的,所以我想知道是否存在更好的方法。

这是我的代码 - 显示的部分是我在名为CheckedPtr的类中定义的部分。我可以做得更好,和/或没有宏吗?我宁愿不手动编写所有这些函数,即使它意味着宏的风险。

// 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

1 个答案:

答案 0 :(得分:1)

正如评论者已经说过的那样,不要使用宏。如果你想要一个最小的实现但是有一套完整的比较函数,我相信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<函数并让动物类派生自boost::less_than_comparable<animal>的情况下,您可以获得运算符><=>=

还有与stackoverflow相关的其他问题。参见

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

How do boost operators work?