1

我希望能够在使用 cpp-netlib 构建的服务器中获取包含 utf8 字符的 HTTP 请求标头值。我知道根据使用的字符串类型,请求和响应有两种包装类 -request_header_narrowrequest_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

似乎我找到了至少一个解决方案,不确定它是否是最好的,所以欢迎发表评论,但似乎至少有一种方法是定义一个新的服务器标签集,然后将这些标签传递给服务器基类:

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 回答