带有谓词支持的c ++模板函数

时间:2015-06-10 15:36:39

标签: c++ templates

我想使用template实现优先级队列。我试过但是我收到了一些错误,我想传递自定义谓词支持以减少功能。

document.getElementById('draw-canvas').addEventListener('click', function(){ draw(); }, false);

我收到此错误。

#include <iostream>

using namespace std;

template <typename T, std::size_t N, typename lessFunction>
class MyClass
{
    typedef std::size_t     size_type;
public:
    void push( const T& t) {
        //
        size_type index ;//(some value .. say 5)
        //...//
        if(lessFunction(m_buffer[index], t))
        {
            /// do something
        }
    }

private:
    T m_buffer[N];
};

struct myCompare
{
    bool operator() (int& x, const int& y) {
        return abs(x) < abs(y);
    }
};

int main()
{
    MyClass<int , 8, myCompare> obj;
    obj.push(1);
    return 0;
}

请指正。我还有一个问题 该模板如何使用仿函数以及作为lessFunction的功能?

2 个答案:

答案 0 :(得分:3)

您需要创建该类的实例,然后在推送成员函数中使用overloaded()运算符。

...
lessFunction f ;
if (f(m_buffer[index], t))
...

运算符重载函数不是静态成员函数,因此需要声明要调用的类的实例。

答案 1 :(得分:0)

您必须在对象上调用lessFunction::operator(int&, const int&),因为运算符重载功能可能不是静态的。因此,您可以创建它的对象:

 class MyClass
 {
     lessFunction comparator;
 };

并在需要时以这种方式调用:

if ( comparator(m_buffer[index], t) )

你也可以将它声明为一个局部变量,但你最好只保留一个实例可以在整个班级中访问它。
最后,您可以考虑使用std::less,也许作为默认模板参数,这样您就不必像myCompare那样重新实现它。

template <typename T, std::size_t N, typename lessFunction = std::less<T>> class MyClass