C++ 不知道在使用回调函数时使用"this"和"std::placeholders::_1"是什么意思
C++ I don't know what it means to use "this" and "std::placeholders::_1" when using the callback function
我正在尝试通过查看cpprestSDK 的示例代码来制作服务器。
但是我不知道为什么我在示例代码中绑定
下面是示例代码。
stdafx.h
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);
};
hander.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);
但是失败了
你能告诉我为什么我在绑定时使用“this”和“std::placeholders::_1”吗?
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
类型的参数
- a return 输入
void
.
普通函数 void handle(http_request)
将匹配此必需的签名。
如果你想注册一个(非static
)成员函数,这也是可能的,但你必须同时提供对象(因为非static
成员函数可能不会被调用没有对象)。
std::bind(&Handler::handle_get, this, std::placeholders::_1)
充当(一种)适配器,使您的成员函数(使用 this
作为绑定对象)符合该要求。
std::placeholders::_1
表示将参数(http_request
类型)绑定到包装的成员函数调用的位置。
一种更简单的方法是使用 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); });
进一步阅读:
我正在尝试通过查看cpprestSDK 的示例代码来制作服务器。 但是我不知道为什么我在示例代码中绑定
下面是示例代码。
stdafx.h
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);
};
hander.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);
但是失败了
你能告诉我为什么我在绑定时使用“this”和“std::placeholders::_1”吗?
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
类型的参数
- a return 输入
void
.
普通函数 void handle(http_request)
将匹配此必需的签名。
如果你想注册一个(非static
)成员函数,这也是可能的,但你必须同时提供对象(因为非static
成员函数可能不会被调用没有对象)。
std::bind(&Handler::handle_get, this, std::placeholders::_1)
充当(一种)适配器,使您的成员函数(使用 this
作为绑定对象)符合该要求。
std::placeholders::_1
表示将参数(http_request
类型)绑定到包装的成员函数调用的位置。
一种更简单的方法是使用 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); });
进一步阅读: