c ++ 0x lambdas,不要让我作为函数ptr传递

时间:2011-05-28 22:30:24

标签: boost lambda bind boost-asio c++11

我目前正在用C ++ 0x编写一个程序,我很陌生。
我在对象之间设置回调并使用lambda来匹配类型(如boost::bind()所做的那样)

如果我在asio库中调用函数,如:

 socket_.async_read_some(buffer(&(pBuf->front()), szBuffer),                                                    
     [=](const boost::system::error_code &error, size_t byTrans) {                                               
                      this->doneRead(callBack, pBuf, error, byTrans); });

这编译得很好,并按预期运行,'doneRead'从'async_read_some'调回来

所以我在自己的代码中有类似的回调:

client->asyncRead([=](string msg){this->newMsg(msg); });

这只需要一个字符串,而asyncReads原型如下

void ClientConnection::asyncRead(void(*callBack)(string)) 

但是我得到了这个编译错误:

  

Server.cpp:在成员函数'void中   服务器:: clientAccepted(STD :: shared_ptr的,   const boost :: system :: error_code&)':   Server.cpp:31:3:错误:没有匹配   呼叫功能   “ClientConnection ::异步读取(服务器:: clientAccepted(STD :: shared_ptr的,   常量   提高::系统:: ERROR_CODE&安培)::)”   Server.cpp:31:3:注意:候选人是:   ClientConnection.h:16:9:注意:无效   ClientConnection ::异步读取(无效   (*)(的std :: string))   ClientConnection.h:16:9:注意:没有   参数1的已知转换   “服务器:: clientAccepted(STD :: shared_ptr的,   常量   提高::系统:: ERROR_CODE和放大器;)::”   'void(*)(std :: string)'

如何解决此问题?

1 个答案:

答案 0 :(得分:11)

你的lambda隐含地捕获this。捕获事物的lambda无法转换为原始函数指针。

所以你需要编写asyncRead所以它直接接受lambda函数对象,而不是让它转换为函数指针

template<typename CallbackType>
void ClientConnection::asyncRead(CallbackType callback);

或者,如果您不想将其作为模板编写,则可以使用多态函数对象包装器

void ClientConnection::asyncRead(std::function<void(string)> callBack);

我还会考虑更改回调的接口,以便它通过const引用接受字符串(除非所有回调实现本身都想要在内部修改或保存/移动传递的字符串,这在您的情况下似乎不太可能)。