111*_*111 5 lambda boost 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); });
Run Code Online (Sandbox Code Playgroud)
这编译得很好,并按预期运行,'doneRead'从'async_read_some'回调
所以我在自己的代码中有类似的回调:
client->asyncRead([=](string msg){this->newMsg(msg); });
Run Code Online (Sandbox Code Playgroud)
这只需要一个字符串,而asyncReads原型如下所示
void ClientConnection::asyncRead(void(*callBack)(string))
Run Code Online (Sandbox Code Playgroud)
但我得到这个编译错误:
Server.cpp:在成员函数'void Server :: clientAccepted(std :: shared_ptr,const boost :: system :: error_code&)'中:Server.cpp:31:3:错误:没有用于调用'ClientConnection ::的匹配函数asyncRead(Server :: clientAccepted(std :: shared_ptr,const boost :: system :: error_code&)::)'Server.cpp:31:3:注意:候选者是:ClientConnection.h:16:9:注意:void ClientConnection :: asyncRead(void(*)(std :: string))ClientConnection.h:16:9:注意:来自'Server :: clientAccepted(std :: shared_ptr,const boost :: system ::)的参数1没有已知的转换error_code&)::'to'void(*)(std :: string)'
如何解决这个问题?
Joh*_*itb 11
你的lambda this隐含地捕获.捕获事物的lambda无法转换为原始函数指针.
所以你需要写,asyncRead所以它直接接受lambda函数对象,而不是让它转换为函数指针
template<typename CallbackType>
void ClientConnection::asyncRead(CallbackType callback);
Run Code Online (Sandbox Code Playgroud)
或者,如果您不想将其作为模板编写,则可以使用多态函数对象包装器
void ClientConnection::asyncRead(std::function<void(string)> callBack);
Run Code Online (Sandbox Code Playgroud)
我还会考虑更改回调的接口,以便它通过const引用接受字符串(除非所有回调实现本身都想要在内部修改或保存/移动传递的字符串,这在您的情况下似乎不太可能).
| 归档时间: |
|
| 查看次数: |
670 次 |
| 最近记录: |