Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;如何将类方法传递给请求对callable的引用的函数_C++_C++11 - Fatal编程技术网

C++ C++;如何将类方法传递给请求对callable的引用的函数

C++ C++;如何将类方法传递给请求对callable的引用的函数,c++,c++11,C++,C++11,我想将一个类方法(绑定到一个对象)传递给库中的一个函数,该函数要求对可调用对象进行非常量引用 如果该参数不是通过引用请求的,那么它在std::bind中工作得非常好。我不知道为什么它被引用,我不能改变它 有没有办法使std::bind的结果成为左值?还是我应该重做一切 下面是显示问题的代码: #include <iostream> #include <functional> #include <string> using namespace std::plac

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

如果该参数不是通过引用请求的,那么它在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;
}
#包括
#包括
#包括
使用名称空间std::占位符;
//我无法更改库中的代码
类代理{
公众:
模板
无效寄存器\u处理程序(函子&f){
//f存储在ctor的初始值设定项列表中连接\u事件\u通用\u调度程序的数据成员“functor&f”中。
std::自动ptr监视器(新详细信息::连接\事件\通用\调度程序(f));
pimpl\u base\u->寄存器\u连接\u事件\u监视器(监视器);
}
};
//我可以编辑的代码
类PersistentConnection{
公众:
PersistentConnection():数据成员(“世界”){
代理注册处理程序(std::bind(&PersistentConnection::internal_处理程序,this,_1));
}
私人:
无效内部_处理程序(std::string消息){

std::cout通过将表达式赋给变量,从表达式中生成左值。这就是术语最初的意思-左值出现在赋值运算符的左侧。在这种情况下,根据名称
register\u 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_;
PersistentConnection():
数据成员(“世界”),
处理程序(std::bind(&PersistentConnection::internal_处理程序,this,_1))
{
代理注册经办人(经办人);
}
函数处理程序;

如果
代理
保存您传入的可调用项并需要一个左值,而不是提供成员函数,那么您可以只提供您自己

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_;
};
类PersistentConnection{
公众:
PersistentConnection():数据成员(“世界”){
代理注册处理程序(*此);
}
void运算符()(std::srting消息){

std::你可以使用
std::function
将其存储为类成员以获取左值吗?可能的重复:库是存储函数对象还是只是调用它?如果它存储了,你能更新问题以表明这一点吗?等等,
register\u handler
接受左值并复制它吗?@Barry lib的完整代码:.File where to start:src/cpp/agent.h.告诉我你的想法!现在你在UB land,因为代理引用了一个已销毁的对象。Oops。被以下事实弄糊涂了:模拟代码实际上并没有在任何地方存储可调用的对象,而是基于原始的名称。确实,原始代理::register\u处理程序存储了可调用的对象没有这样的东西,
std::function
@user368507被编辑为建议一个
std::function
数据成员。是的,这可以工作,但实际上我有两种不同的方法作为处理程序传递。(我同意我的代码片段没有显示它)