c++ - boost::signals2 的绑定(bind)类成员函数

标签 c++ boost c++11 boost-signals2 stdbind

我已经使用 std::bind 创建了一个涉及类成员函数的 lambda,但 boost::signals2 不会接受它。

我有课Cut当有新的 Event 时我想通知您调用void Cut::newEvent(Event& e)查看.

我创建了一个与 Cut 实例的 lambda 绑定(bind),当我向它传递一个 Event 时,它会按预期工作。 (代码编译并输出“Registered new event”。)

但是,当我尝试将此 lambda 连接到 boost::signals2::signal<void(Event&)> 的实例时它提示以下消息:

error: 'f' cannot be used as a function

这很奇怪,因为我可以将它用作 main() 中的函数。 (如果我使用 std::function<void(Event&)> 而不是 auto,我会得到相同的结果。

有可能实现这个功能吗?为什么目前不起作用?

这是相关代码:

#include <iostream>
#include <boost/signals2.hpp>

//Dummy event class
struct Event
{ int val; };

typedef boost::signals2::signal<void (Event&) >
EventBroadcaster;

//Class I want to notified of new events
class Cut
{
    public:
        void newEvent( Event& e)
        {
            std::cout << "Registered new event" << std::endl;
            fResult = true;
        }

        bool check() const
        { return fResult; }

    private:
        bool fResult;
};

int main()
{

    Cut c{};

    //Lambda to call newEvent on c
    auto f =
        std::bind( &Cut::newEvent, &c,
                std::placeholders::_1) ;

    Event e{};
    f(e); //works

    EventBroadcaster eb;
    eb.connect(&f); //doesn't work
}

最佳答案

你应该使用

eb.connect(f);

因为f是可调用函数对象,但&f不可调用。

关于c++ - boost::signals2 的绑定(bind)类成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17809957/

相关文章:

C++:遍历 vector 的 vector

c++ - 使用具有自定义标量类型的 Eigen::Geometry 模块

c++ - 虚幻引擎 4 -- 类型转换

c++ - 循环在此代码中仅迭代一次,而在另一代码中它正确迭代

http - 在 cpp-netlib 中添加 Access-Control-Allow-Origin 选项

c++ - 从模板化类版本控制派生类的序列化

c++ - 在 C++ 中创建 lambda 映射

c++ - 为什么重载运算符&&错误?

c++ - API 文档中的 void**

c++ - 可以使用 file_descriptor 创建一个双重可搜索的 Boost Iostream 吗?