由运营商填写的模板

时间:2011-03-22 17:00:57

标签: c++ templates operators

您可以在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,但不是两个都在同一个编译中。不过,我可能会忽略一种方式。

2 个答案:

答案 0 :(得分:8)

执行std::map和朋友的操作:将比较函数/仿函数作为模板参数。请参阅std::lessstd::greater

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

答案 1 :(得分: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);
}