首页 文章

C如何将类方法传递给一个要求引用可调用的函数

提问于
浏览
1

我想将一个类方法(绑定到一个对象)传递给一个库中的函数,该函数要求对一个可调用的非const引用 .

如果没有通过引用询问参数,它将与std :: bind完美配合 . 我不知道为什么通过引用询问它,我无法改变它 .

有没有办法让std :: bind的结果成为左值?或者我应该重做一切吗?

这是一个显示问题的代码:

#include <iostream>
#include <functional>
#include <string>
using namespace std::placeholders;

// code in a lib that i cannot change
class Agent {
public:
        template <typename functor>
        void register_handler(functor & f) {
            // f is stored in data member "functor & f_;" of connection_event_generic_dispatcher in initializer list of ctor.
            std::auto_ptr<details::connection_event_dispatcher_base> monitor(new details::connection_event_generic_dispatcher<functor>(f));

            pimpl_base_->register_connection_event_monitor(monitor);
        }
};

// code i can edit
class PersistentConnection {
public:
        PersistentConnection(): data_member_("world") {
                agent_.register_handler(std::bind(&PersistentConnection::internal_handler, this, _1));
        }

private:
        void internal_handler(std::string message) {
                std::cout << message << " " << data_member_ << std::endl;
        }

        std::string data_member_;
        Agent agent_;
};

int main (int argc, char** argv) {
        PersistentConnection p;
        return 0;
}

编译命令行和错误:

clang --std = c 11 /tmp/test.cpp -o / tmp / test /tmp/test.cpp:20:10:错误:没有匹配的成员函数来调用'register_handler'agent_.register_handler(std :: bind(&PersistentConnection :: internal_handler,this,_1)); ~~~~~~~ ^ ~~~~~~~~~~~~~~~~ / tmp / test.cpp:10:7:注意:候选函数[有functor = std :: _ Bind)>(PersistentConnection) *,std :: _ Placeholder <1>)>]不可行:期望第一个参数的l值为void register_handler(functor&f){^ 1生成错误 .

2 回答

  • 1

    通过将表达式赋值给变量,可以从表达式中生成左值 . 这就是该术语最初的含义 - 左值出现在赋值运算符的左侧 . 在这种情况下,基于名称 register_handler ,可调用大小可能存储在某处供以后使用,因此临时或局部变量会希望将其存储为数据成员 . 您不知道 bind 表达式的确切类型,非静态数据成员在C 11中不能 auto ,但您可以使用 std::function

    PersistentConnection(): 
        data_member_("world"),
        handler_(std::bind(&PersistentConnection::internal_handler, this, _1))
    {
        agent_.register_handler(handler);
    }
    
    std::function<void(std::string)> handler_;
    
  • 0

    如果 Agent 持有存储您传入的可调用并需要左值,而不是提供成员函数,也许您可以自己提供?

    class PersistentConnection {
    public:
        PersistentConnection(): data_member_("world") {
            agent_.register_handler(*this);
        }
    
        void operator()(std::srting message) {
            std::cout << message << " " << data_member_ << std::endl;
        }
    
        std::string data_member_;
        Agent agent_;
    };
    

相关问题