实例化具有回调函数类型的模板
Instantiating template with functor type for callback
我对 cpp-netlib 中用于实现 HTTP 服务器和处理程序请求的 'technique' 有疑问。
文档指出:
与HTTP客户端一样,cpp-netlib自带的HTTP服务器也可以通过标签机制进行扩展和嵌入。 basic_server 的模板 class 声明如下:
namespace boost { namespace network { namespace http {
template <class Tag, class RequestHandler> basic_server;
}}}
第二个模板参数用于指定请求处理程序类型。请求处理程序类型是一个仿函数类型,它应该重载函数调用运算符(RequestHandler::operator() 应该被重载),它有两个参数:第一个是对 const basic_request 的引用,第二个是一个引用 basic_response 个实例。
所以在我的代码中我创建了一个处理程序(它声明了所需的函数)并使用它来构造一个选项对象:
boost::network::http::server<HttpRequestHandler>::options options(*handler);
然后使用选项和处理程序标记创建服务器(我认为这是正确的术语):
boost::network::http::server<HttpRequestHandler> server(options);
根据需要,我的处理程序class 提供了函数调用运算符。一切正常 - 即在收到消息时调用处理程序。
我的问题是:库如何访问我的处理程序的完整类型,以便它可以在未包含它时调用该函数?
我想库实例化了您的 class 的对象,它作为模板参数传递。然后它只使用函数调用运算符,您根据库的要求重载了它。
在图书馆的内部发生了以下几件事:
template <class Functor>
void doStuff() {
auto callback = Functor();
callback();
}
它不需要 #include
你的 class 在它的头文件中,因为你正在调用的函数是一个模板函数 - 你实际调用的函数的确切定义是在编译.
我对 cpp-netlib 中用于实现 HTTP 服务器和处理程序请求的 'technique' 有疑问。
文档指出:
与HTTP客户端一样,cpp-netlib自带的HTTP服务器也可以通过标签机制进行扩展和嵌入。 basic_server 的模板 class 声明如下:
namespace boost { namespace network { namespace http {
template <class Tag, class RequestHandler> basic_server;
}}}
第二个模板参数用于指定请求处理程序类型。请求处理程序类型是一个仿函数类型,它应该重载函数调用运算符(RequestHandler::operator() 应该被重载),它有两个参数:第一个是对 const basic_request 的引用,第二个是一个引用 basic_response 个实例。
所以在我的代码中我创建了一个处理程序(它声明了所需的函数)并使用它来构造一个选项对象:
boost::network::http::server<HttpRequestHandler>::options options(*handler);
然后使用选项和处理程序标记创建服务器(我认为这是正确的术语):
boost::network::http::server<HttpRequestHandler> server(options);
根据需要,我的处理程序class 提供了函数调用运算符。一切正常 - 即在收到消息时调用处理程序。
我的问题是:库如何访问我的处理程序的完整类型,以便它可以在未包含它时调用该函数?
我想库实例化了您的 class 的对象,它作为模板参数传递。然后它只使用函数调用运算符,您根据库的要求重载了它。
在图书馆的内部发生了以下几件事:
template <class Functor>
void doStuff() {
auto callback = Functor();
callback();
}
它不需要 #include
你的 class 在它的头文件中,因为你正在调用的函数是一个模板函数 - 你实际调用的函数的确切定义是在编译.