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

c++ template function with predicate support

本文关键字:函数 c++ 谓词 支持      更新时间:2023-10-16

我想使用模板实现一个优先级队列。我尝试过,但我得到一些错误,我想通过自定义谓词支持更少的功能。

#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;
}

我得到这个错误。

/home/sanju/code/circular-buffer/main.cpp:17: error: no matching function for call to 'myCompare::myCompare(int&, const int&)'
         if(lessFunction(m_buffer[index], t))

请纠正我。我还有一个问题

您需要创建类的实例,然后在push成员函数中使用重载()操作符。

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

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

必须在对象上调用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