0

HTTP サーバーとハンドラー要求を実装するために cpp-netlib で使用される「手法」について質問があります。

ドキュメントには次のように記載されています。

HTTP クライアントと同様に、cpp-netlib で提供される HTTP サーバーは、タグ メカニズムによって拡張可能であり、組み込み可能です。basic_server のテンプレート クラス宣言は次のとおりです。

namespace boost { namespace network { namespace http {

    template <class Tag, class RequestHandler> basic_server;

}}}

2 番目のテンプレート引数は、リクエスト ハンドラのタイプを指定するために使用されます。リクエスト ハンドラーの型は、関数呼び出し演算子 (RequestHandler::operator() をオーバーロードする必要があります) をオーバーロードする必要があるファンクター型であり、2 つのパラメーターを受け取ります。実例。

したがって、私のコードでは、(必要な関数を宣言する) ハンドラーを作成し、それを使用してオプション オブジェクトを構築します。

boost::network::http::server<HttpRequestHandler>::options options(*handler);

次に、オプションとハンドラー タグを使用してサーバーを作成します (これが正しい用語だと思います)。

boost::network::http::server<HttpRequestHandler> server(options);

必要に応じて、ハンドラー クラスは関数呼び出し演算子を提供します。すべて正常に動作します。つまり、メッセージを受信するとハンドラーが呼び出されます。

私の質問は次のとおりです。ライブラリがハンドラーの完全な型にアクセスして、関数が含まれていないときに関数を呼び出すことができるのはどうしてですか?

4

1 に答える 1

2

ライブラリは、テンプレート パラメーターとして渡されるクラスのオブジェクトをインスタンス化すると思います。次に、ライブラリの要求に従ってオーバーロードした関数呼び出し演算子を使用します。

ライブラリの内部では、次の行に沿って何かが発生します。

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

呼び出している関数はテンプレート関数であるため、ヘッダー ファイルにクラスを含める必要はありません#include。実際に呼び出している関数の正確な定義は、コンパイル中に生成されます。

于 2015-03-18T08:42:30.740 に答える