首页 > 解决方案 > 替换 std::greater 等

问题描述

在我的 C++ 代码中,我编写了两个函子,我可以将它们用作函数的参数。像这样:

template<class T>
class MyGreater{
public:
    bool operator()(const T &value1, const T &value2) {
            return value1 > value2;
    }
};

template<class T>
class MyEquall{
public:
    bool operator()(const T &value1, const T &value2) {
            return value1 == value2;
    }
};

但是现在我希望像其他 4 个一样编写来涵盖所有这些:<,<=,>,>=,==,!=这是否意味着我需要为每个人编写 4 个不同的类?

重要提示:我知道我可以使用 std::Greater 等,但我的教授不允许这样做,并告诉我们编写自己的代码。

我正在使用 C++11 并想坚持使用仿函数

标签: c++classtemplatesoperator-overloadingfunctor

解决方案


如果您的教授不允许使用预处理器,您可以省去一些乏味的样板文件:

#define DEFINE_MY_GENERIC_OP(CLASS_NAME, OP)                  \
template<class T>                                             \
class CLASS_NAME{                                             \
public:                                                       \
    bool operator()(const T &value1, const T &value2) const { \
            return value1 OP value2;                          \
    }                                                         \
}

然后像这样使用它

DEFINE_MY_GENERIC_OP(MyGreater, >);
DEFINE_MY_GENERIC_OP(MyEquall, ==);
// etc

我通常不会推荐预处理器,但由于您面临一个愚蠢的要求,迫使您繁琐地重复相同的标记,它似乎有点合适。

如果这种方法也被禁止,那么不幸的是,您必须拼出每个运算符。


推荐阅读