我正在编写一个CheckedPtr类来练习异常处理(Stroustrup,TC++ PL练习,第四版,问题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
最佳答案
正如评论者已经说过的,不要为此使用宏。如果您希望实现最少的功能但需要一套完整的比较功能,那么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?