绑定std :: function错误

时间:2017-03-02 14:35:35

标签: c++ c++11 std-function stdbind

尝试使用std :: function和std :: bind绑定方法时遇到问题。

在我的CommunicationService类中:

this->httpServer->BindGET(std::bind(&CommunicationService::ManageGETRequest, this, std::placeholders::_1));

CommunicationService :: ManageGetRequest签名:

MessageContent CommunicationService::ManageGetRequest(std::string uri, MessageContent msgContent)

BindGET签名:

void RESTServer::BindGET(RequestFunction getMethod)

RequestFunction typedef:

typedef std::function<MessageContent(std::string, MessageContent)> RequestFunction;

BindGET上的错误:

  

错误C2664:'无效   RESTServer :: BindGET(RequestFunction)“:   无法转换参数1   'std :: _ Binder&lt; std :: _ Unforced,MessageContent(__ cdecl   通信:: CommunicationService :: *   )(的std :: string,在messageContent),通信:: CommunicationService   * const,const std :: _ Ph&lt; 1> &安培; &GT;”到'RequestFunction'

之前,我的RequestFunction就是这样:

typedef std::function<void(std::string)> RequestFunction;

它完美无缺。 (当然,调整了所有签名方法)。

我不明白导致错误的原因。

1 个答案:

答案 0 :(得分:8)

更改

1 2 3 4 5

this->httpServer->BindGET(
  std::bind(&CommunicationService::ManageGETRequest, this, std::placeholders::_1)
);

使用this->httpServer->BindGET( [this](std::string uri, MessageContent msgContent) { this->ManageGETRequest(std::move(uri), std::move(msgContent)); } ); 几乎总是一个坏主意。 Lambdas解决了同样的问题,并且几乎总是做得更好,并提供更好的错误消息。 std::bind具有lambdas特征的少数情况并不是C ++ 14主要涵盖的地方。

std::bindstd::bind编写在pre-lambda C ++ 11中,然后同时将lambdas带入标准。当时,lambdas有一些限制,所以boost::bind是有道理的。但这并不是lambdas C ++ 11局限性发生的情况之一,而且随着lambda功能的增强,学习使用std::bind的边际效用已大大降低。

即使你掌握了std::bind,它也有足够令人讨厌的怪癖(比如传递一个绑定表达式来绑定),避免它有收益。

你也可以用以下方法修复它:

std::bind

但我不认为你应该这样做。