将成员函数指针作为参数传递? Q&安培; A

时间:2013-11-18 01:12:15

标签: c++ member-function-pointers

我正在尝试做一些我认为非常简单的事情 - 传递一个队列和一个函数,并将该函数应用于队列中的每个项目 - 但我无法将其编译。

class Foo
{
public:
    void doStuff();
    void doStuffOnBars(std::queue<Bar*> &bars, void (*func)(Bar &bar));
    virtual void stuff(Bar &bar) = 0;

    std::queue<Bar*> _bars;
};

void Foo::doStuff()
{
    doStuffOnBars(_bars, stuff);
}

void Foo::doStuffOnBars(std::queue<Bar*> &bars, void (*func)(Bar &bar))
{
    while (!bars.empty())
    {
        func(*bars.front());
        bars.pop();
    }
}

doStuffOnBars(_bars, stuff)doStuffOnBars(_bars, this->stuff)返回C3867。

doStuffOnBars(_bars, &stuff)doStuffOnBars(_bars, &this->stuff)返回C2276。

带有doStuffOnBars(_bars, &(Foo::stuff))

void doStuffOnBars(std::queue<Bar*> &bars, void (Foo::*func)(Bar &bar))会返回C2064。

所以我完全没有想法。我见过的所有函数指针的例子似乎都神奇地起作用 - 我认为它们中的大多数都在全球范围内?为什么这与成员函数不同?

1 个答案:

答案 0 :(得分:2)

在我提出这个问题之前,我已经设法自己解决了这个问题(经过一些咬指甲和拔毛之后)。我会为其他人提供工作代码的参考:

class Foo
{
public:
    void doStuff();
    void doStuffOnBars(std::queue<Bar*> &bars, void (Foo::*func)(Bar &bar));
    virtual void stuff(Bar &bar) = 0;

    std::queue<Bar*> _bars;
};

void Foo::doStuff()
{
    doStuffOnBars(_bars, stuff);
}

void Foo::doStuffOnBars(std::queue<Bar*> &bars, void (Foo::*func)(Bar &bar))
{
    while (!bars.empty())
    {
        (this->*func)(*bars.front());
        bars.pop();
    }
}

必须使用(this->*func)调用该函数 - 该函数需要一个对象引用(this)并且该函数需要被解引用(毕竟它是一个指针) 。现在,我知道,它似乎非常明显,并且很有意义!!但是我想如果你不熟悉使用函数指针那么它会引起一些混乱 - 这就是我发布这个答案的原因。