我希望能够在使用cpp-netlib构建的服务器中获取包含utf8字符的HTTP请求标头值。我理解根据使用的字符串类型 - request_header_narrow
和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
由于我不太熟悉模板元编程的东西,我不太了解Boosts mpl::if_
逻辑,如果两者都有mpl::false_
作为默认值,那么默认字符串类型是如何实际确定的?任何人都可以清除这个或解释如何使cpp-netlib使用std::wstring
作为默认字符串类型吗?
答案 0 :(得分: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;