gpt4 book ai didi

C++使用回调函数时不知道使用 "this"和 "std::placeholders::_1"是什么意思

转载 作者:行者123 更新时间:2023-12-01 15:12:20 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





C++ callback using class member

(6 个回答)


1年前关闭。




我正在尝试通过查看 cpprestSDK 的示例代码来制作服务器。
但我不知道为什么我在示例代码中绑定(bind)。
下面是示例代码。
标准数据文件

class Handler{
public:
Handler() {};
Handler(utility::string_t url);

pplx::task<void> open() { return m_listener.open(); }
pplx::task<void> close() { return m_listener.close(); }

private:
void handle_get(http_request request);
void handle_put(http_request request);
void handle_post(http_request request);
void handle_del(http_request request);
};
处理程序.cpp
  
#include "stdafx.hpp"

Handler::Handler(utility::string_t url) : m_listener(url)
{

m_listener.support(methods::GET, std::bind(&Handler::handle_get, this, std::placeholders::_1));
m_listener.support(methods::PUT, std::bind(&Handler::handle_put, this, std::placeholders::_1));
m_listener.support(methods::POST, std::bind(&Handler::handle_post, this, std::placeholders::_1));
m_listener.support(methods::DEL, std::bind(&Handler::handle_del, this, std::placeholders::_1));
}
查看支持的引用,它的定义如下。 void support (const http::method &method, const std::function< void(http_request)> &handler)我以为我可以这样定义它: m_listener.support(methods::GET, &Handler::handle_get);但它失败了。
你能告诉我为什么我在绑定(bind)时使用“this”和“std::placeholders::_1”吗?
示例代码: https://docs.microsoft.com/ko-kr/archive/blogs/christophep/write-your-own-rest-web-server-using-c-using-cpp-rest-sdk-casablanca
cpprestSDK 监听器引用: https://microsoft.github.io/cpprestsdk/classweb_1_1http_1_1experimental_1_1listener_1_1http__listener.html

最佳答案

成员函数

void support (const http::method &method,
const std::function< void(http_request)> &handler)
预计 handler成为具有
  • http_request 类型的参数
  • 返回类型 void .

  • 一个普通函数 void handle(http_request)将匹配此必需的签名。
    如果你想注册一个(非 static )成员函数,这也是可能的,但你也必须提供对象(因为非 static 成员函数可能不会在没有对象的情况下被调用)。 std::bind(&Handler::handle_get, this, std::placeholders::_1)充当(一种)适配器以使您的成员函数(以 this 作为绑定(bind)对象)满足该要求。 std::placeholders::_1表示,将参数(类型为 http_request )绑定(bind)到包装的成员函数调用的位置。
    更简单的方法是使用 lambda 作为适配器(而不是 bind ):
    m_listener.support(methods::GET, [this](http_request http_req) { this->handle_get(http_req); });
    甚至:
    m_listener.support(methods::GET, [this](http_request http_req) { handle_get(http_req); });

    进一步阅读:
  • std::bind
  • std::placeholders
  • 关于C++使用回调函数时不知道使用 "this"和 "std::placeholders::_1"是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63687470/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com