我想将一个类方法(绑定到一个对象)传递给一个库中的函数,该函数要求对一个可调用的非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 回答
通过将表达式赋值给变量,可以从表达式中生成左值 . 这就是该术语最初的含义 - 左值出现在赋值运算符的左侧 . 在这种情况下,基于名称
register_handler
,可调用大小可能存储在某处供以后使用,因此临时或局部变量会希望将其存储为数据成员 . 您不知道bind
表达式的确切类型,非静态数据成员在C 11中不能auto
,但您可以使用std::function
!如果
Agent
持有存储您传入的可调用并需要左值,而不是提供成员函数,也许您可以自己提供?