我正在写一个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
答案 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?