【问题标题】:the differences between function-object and function-pointer?函数对象和函数指针的区别?
【发布时间】:2017-01-27 04:47:03
【问题描述】:

我定义了一个类,然后将指向 Foo 的指针保存在 priority_queue 中,并使用我定义的 cmp 函数。

但是如果 cmp-funtion 调用 function-object 就会出错:

class Foo
{
    friend bool cmp(Foo *, Foo *);
public:
    Foo() = default;
    Foo(int x):val(x) {}
private:
    int val;
};
bool cmp(Foo *a, Foo *b)
{
    return a->val < b->val;
}
int main()
{
    priority_queue<Foo*, vector<Foo*>, decltype(cmp)*> que;
    que.push(new Foo(5));
    que.push(new Foo(6));
    return 0;
}

functione-object正常运行。

class Foo
{
    friend struct cmp;
public:
    Foo() = default;
    Foo(int x):val(x) {}
private:
    int val;
};
struct cmp
{
    bool operator()(Foo *a, Foo *b)
    {
        return a->val < b->val;
    }
};
int main()
{
    priority_queue<Foo*, vector<Foo*>, cmp> que;
    que.push(new Foo(5));
    que.push(new Foo(6));
    return 0;
}

【问题讨论】:

  • IDE 是 code::blocks
  • “发生错误”?真的吗?
  • 未编译错误
  • 默认初始化的函数指针的值为nullptrstruct cmp 的默认初始化实例是一个有效实例。 decltype(cmp) 就是 bool(Foo *a, Foo *b) - “某个函数采用两个 Foo* 并返回一个 bool”。没有任何东西将它与名为cmp 的特定函数联系起来。同样,decltype(42) x; 等价于 int x; - 它不会神奇地为 x 赋予 42 的值。

标签: c++ class c++11 function-pointers function-object


【解决方案1】:

您需要使用您希望用作比较的函数来构造您的 que 变量。

#include <vector>
#include <queue>

using namespace std;

class Foo
{
    friend bool cmp(Foo*, Foo*);
public:
    Foo() = default;
    Foo(int x):val(x) {}
private:
    int val;
};
bool cmp(Foo* a, Foo* b)
{
    return a->val < b->val;
}
int main()
{
    //                                                     vvv
    priority_queue<Foo*, vector<Foo*>, decltype(cmp)*> que(cmp);
    que.push(new Foo(5));
    que.push(new Foo(6));

    return 0;
}

【讨论】:

    猜你喜欢
    • 2017-11-03
    • 2012-10-03
    • 2022-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    相关资源
    最近更新 更多