首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有谓词支持的c++模板函数

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

Stack Overflow用户
提问于 2015-06-10 15:36:38
回答 2查看 1.9K关注 0票数 0

我想用模板实现一个优先级队列,我试过了,但是我遇到了一些错误,我想通过自定义谓词支持更少的函数。

代码语言:javascript
复制
#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;
}

我得到了这个错误。

代码语言:javascript
复制
/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))

请纠正我。我还有一个问题,这个模板如何使用函子和函数作为lessFunction?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-10 15:41:10

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

代码语言:javascript
复制
...
lessFunction f ;
if (f(m_buffer[index], t))
...

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

票数 3
EN

Stack Overflow用户

发布于 2015-06-10 15:53:05

必须对对象调用lessFunction::operator(int&, const int&),因为运算符重载函数可能不是静态的。因此,您可以创建其对象如下:

代码语言:javascript
复制
 class MyClass
 {
     lessFunction comparator;
 };

如果需要的话,可以这样称呼:

代码语言:javascript
复制
if ( comparator(m_buffer[index], t) )

您也可以将它声明为局部变量,但最好在整个类中只保留它的一个实例。

最后,您可以考虑使用std::less作为默认的模板参数,这样您就不必像对myCompare那样重新实现它。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30760982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档