1

cpp-netlib で構築されたサーバーで、utf8 文字を含む HTTP 要求ヘッダー値を取得できるようにしたいと考えています。request_header_narrow使用される文字列タイプに応じて、リクエストとレスポンスの 2 種類のラッパー クラスがあることを理解していますrequest_header_wide

template <class Tag>
    struct request_header
    : mpl::if_<
        is_default_string<Tag>,
        request_header_narrow,
        typename mpl::if_<
            is_default_wstring<Tag>,
            request_header_wide,
            unsupported_tag<Tag>
        >::type
    >
    {};

namespace boost { namespace network {

    template <class Tag, class Enable = void>
    struct is_default_string : mpl::false_ {};

    template <class Tag>
    struct is_default_string<Tag, typename enable_if<typename Tag::is_default_string>::type> : mpl::true_ {};

} // namespace network

} // namespace boost

namespace boost { namespace network {

    template <class Tag, class Enable = void>
    struct is_default_wstring : mpl::false_ {};

    template <class Tag>
    struct is_default_wstring<Tag, typename enable_if<typename Tag::is_default_wstring>::type> : mpl::true_ {};

} // namespace network

} // namespace boost

私はテンプレート メタ プログラミングの経験があまりないので、Boostsmpl::if_ロジックをよく理解していませんでした。また、両方がデフォルト値である場合、デフォルトの文字列型は実際にどのように決定さmpl::false_れますか? 誰かがこれをクリアするか、cpp-netlibstd::wstringをデフォルトの文字列型として使用する方法を説明できますか?

4

1 に答える 1

0

少なくとも1つの解決策を見つけたようですが、それが最善かどうかはわかりませんのでコメントを歓迎しますが、これを行う少なくとも1つの方法は、新しいサーバータグセットを定義し、これらのタグをサーバー基本クラスに渡すことです。

namespace boost { namespace network { namespace http { namespace tags {

    typedef mpl::vector<http, simple, async, pod, default_wstring, server> http_async_wstring_server_tags;

    BOOST_NETWORK_DEFINE_TAG(http_async_wstring_server);

} /* tags */

} /* http */

} /* network */

} /* boost */

namespace http = boost::network::http;
...
typedef http::server_base<http::tags::http_async_wstring_server, CHTTPRequestHandler>::type async_server;
于 2013-10-04T13:32:50.657 に答える