【问题标题】:c++0x lambdas, not letting me pass as function ptrc++0x lambdas,不让我作为函数 ptr 传递
【发布时间】:2011-09-04 02:49:16
【问题描述】:

我目前正在用 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::asyncRead(Server::clientAccepted(std::shared_ptr, 常量 boost::system::error_code&)::)’ Server.cpp:31:3: 注意:候选人是: ClientConnection.h:16:9:注意:无效 ClientConnection::asyncRead(无效 (*)(std::string)) ClientConnection.h:16:9:注意:否 参数 1 的已知转换来自 '服务器::clientAccepted(std::shared_ptr, 常量 boost::system::error_code&)::' to ‘void (*)(std::string)’

如何解决这个问题?

【问题讨论】:

  • 你能分享一下Server::clientAccepted。看起来您正在使用提供的回调,并且 clientAccepted 函数接受的 lambda 类型与您传递的内容不匹配。

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


【解决方案1】:

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

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

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

或者,如果你不想把它写成模板,你可以使用多态函数对象包装器

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

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

【讨论】:

  • 所以我想你不知道你的第二种方式是否是 boost 的方式?我现在正在尝试这种方式。
  • 是的,这个(第二个)似乎已经猜到了,感谢一吨兄弟。
猜你喜欢
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
  • 2010-11-15
  • 2023-04-01
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
相关资源
最近更新 更多