【发布时间】:2016-05-20 18:59:36
【问题描述】:
我想将类方法(绑定到对象)传递给库中的函数,该函数要求对可调用对象进行非常量引用。
如果参数不是通过引用询问的,它可以与 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, 这个,_1)); ~~~~~~~^~~~~~~~~~~~~~~~ /tmp/test.cpp:10:7: 注意:候选函数 [with functor = std::_Bind)> (PersistentConnection *, std::_Placeholder)>] 不是 可行的:期望第一个参数的 l 值 无效寄存器处理程序(函子和 f){ ^ 产生 1 个错误。
【问题讨论】:
-
您可以使用
std::function将其存储为类成员以获取左值。 -
库是存储函数对象还是只是调用它?如果它存储它,您可以更新问题以表明这一点吗?
-
等等,
register_handler通过左值获取并复制它? -
@Barry 库的完整代码:inspirel.com/yami4/files/yami4-gpl-1.10.1.tar.gz。文件从哪里开始:src/cpp/agent.h。告诉我你的想法!