元编程 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?
我正在编写一个 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?