【问题标题】:Instantiating template with functor type for callback使用函子类型为回调实例化模板
【发布时间】:2015-03-18 08:29:55
【问题描述】:

我有一个关于 cpp-netlib 中用于实现 HTTP 服务器和处理程序请求的“技术”的问题。

文档说明:

与 HTTP 客户端一样,cpp-netlib 提供的 HTTP 服务器可以通过标签机制进行扩展,并且是可嵌入的。 basic_server的模板类声明如下:

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);

根据需要,我的处理程序类提供了函数调用运算符。这一切都很好 - 即在收到消息时调用处理程序。

我的问题是:库如何访问我的处理程序的完整类型,以便在未包含该函数时调用该函数?

【问题讨论】:

  • 为什么不用X server(options); 而不是X server(X(options));?...... (其中Xboost::network::http::server&lt;HttpRequestHandler&gt;.
  • 是的。我已经更新了它。复制并粘贴混音。

标签: c++ templates callback cpp-netlib


【解决方案1】:

我想库实例化了你的类的对象,它作为模板参数传递。然后它只是在其上使用函数调用运算符,您已根据库的请求对其进行重载。

在图书馆的内部,发生了如下几件事:

template <class Functor>
void doStuff() {
    auto callback = Functor();
    callback();
}

它不需要在它的头文件中#include你的类,因为你调用的函数是一个模板函数——你实际调用的函数的确切定义是在编译过程中生成的。

【讨论】:

    猜你喜欢
    • 2011-10-07
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多