替换std :: greater等

问题描述 投票:1回答:2

在我的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++ class templates operator-overloading functor
2个回答
1
投票

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

#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

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

如果同样禁止这种方法,那么您必须不幸地将每个运算符拼写掉。


0
投票

“听起来不那么有效”:这是完全错误的印象。就您要编写的代码而言,它可能是最简单的编写方式,并且由于您使用的是C ++ 11,因此根本不需要样板。只是一些狡猾的位:)

using MyGreater = decltype([](auto &&l, auto &&r){ return l > r; });

您还需要上述5行。就这样。这也许是您在C ++中所做的最有效,最直接的事情-看看它与您编写的所有其他代码相比有多简单!当然,由于此类琐碎的代码最有可能出错,因此需要进行单元测试-它是如此简单,以至于我们对其付出的关注最少。我最近研究了一些智能指针代码,其中所有简单位都被打断了,直到为它编写了同样简单的单元测试。困难的部分起了作用,因为它们很难写,我为此给予了很多关注。

如果被允许使用C ++ 20,则只需要UFO /飞船操作员:

using SpaceCowboys  = decltype([](auto &&l, auto &&r){ return l <=> r; });

最后:教授不是要求您这样做以提高效率,而是要看看它是如何完成的(至少以多种方式中的一种)。练习的目的不是避免样板。到目前为止,您至少不得不被迫编写这样的样板,以了解引擎盖下发生的事情。 将其隐藏在宏或其他类似黑客中的建议完全错失了重点,因为无论如何该代码都是不必要的-如果它不是学校项目,那么您可能会使用其他方式来实现它,而无需编写任何代码全部-但这会掩盖正在发生的事情。当然,这可能证明了这一切在教学上的实用性-总是有人可以建议任何老师如何更好地利用学生的教学时间。但是我看不到任何关于这种练习的误导。值得庆幸的是,您一天不被要求连续6个月连续播放所有主要音阶的所有模式:)

© www.soinside.com 2019 - 2024. All rights reserved.