【问题标题】:Template filled by an operator由操作员填写的模板
【发布时间】:2011-03-22 17:00:56
【问题描述】:

你可以在 C++ 中使用模板(或类似的东西)来指定在函数中执行的操作吗?

我不知道如何更清楚地解释它,所以我将向您展示如何(但不是)在代码中完成:

template <operator OPERATION> int getMaxOrMin(int a, int b) {
    return a OPERATION b ? a : b;
}

在哪里找到 a 或 b 的最大值或最小值(这是我的伪语法有点混乱的地方,请耐心等待):

int max = getMaxOrMin< > > (a, b);
int min = getMaxOrMin< < > (a, b);

我知道这根本不是怎么做的(因为它甚至在语法上都没有意义),但我希望这能澄清我想做的事情的类型。

我想知道这一点的原因是我正在制作一个 PriorityQueue 实现,如果无需复制和粘贴代码即可轻松地在支持最大堆或最小堆之间切换会很好不同的类别。

我知道我可以使用宏来做到这一点,但我知道如何做到这一点的唯一方法是给我一个最大堆或一个最小堆,但不能在同一个编译中同时提供。不过,我可能忽略了一条路。

【问题讨论】:

  • 你可以创建一个基类,将 max-heap / min-heap 作为子类,然后在基类中将 getMaxorMin 函数设为虚函数,并在 max-heap/min-heap 中以不同方式实现。

标签: c++ templates operators


【解决方案1】:

std::map 和朋友们做的事:将比较函数/函子作为模板参数。请参阅std::lessstd::greater

请记住,标准库已经有一个开发良好且经过调试的优先级队列,您可以将其与任意比较函数一起使用。

【讨论】:

    【解决方案2】:

    是的,但您需要像仿函数一样定义它:

    template <typename OPERATION>
    int getMaxOrMin(int a, int b)
    {
        OPERATION  operation;
        return operation(a, b) ? a : b;
    }
    

    现在你可以像这样使用它了:

    struct myLess
    {
        bool operator()(int a,int b) const { return a < b; }
    }
    struct myGreat
    {
        bool operator()(int a,int b) const { return a > b; }
    }
    
    void code()
    {
        int x = getMaxOrMin<myLess>(5,6);
        int y = getMaxOrMin<myGreat>(5,6);
    }
    

    这似乎需要做很多工作。但是标准中有很多预定义的函子。在this page 上向下滚动到“6:函数对象”。
    对于您的情况,有:

    std::less
    std::greater
    

    所以代码变成了:

    template <typename OPERATION>
    int getMaxOrMin(int a, int b)
    {
        OPERATION  operation;
        return operation(a, b) ? a : b;
    }
    
    void codeTry2()
    {
        int x = getMaxOrMin<std::less<int> >(5,6);
        int y = getMaxOrMin<std::greater<int> >(5,6);
    }
    

    【讨论】:

    • 最后一个代码 sn-p 不正确,std::lessstd::greater 是模板,您要使用的是该模板的具体实例化:getMaxOrMin&lt; std::less&lt;int&gt; &gt;( 5, 6 )。此外,当使用函数模板(而不是类模板)时,函子通常作为第三个参数传递(按值),而不是作为需要在内部构造的类型参数:template &lt;typename BinaryPredicate&gt; int getMaxOrMin( int a, int b, Functor f ); 并用作 getMaxOrMin( a, b, std::less&lt;int&gt;() ); 我不除了与 STL 保持一致之外,没有其他原因。
    • 固定 std:less 等。在这种情况下,我认为将函子作为第三个参数传递不会添加任何内容(实际上会降低可读性)。但这都是上下文相关的,读者应该使用适合情况的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 2020-08-07
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多