我有这样的枚举:
enum HTTPRequestMethods {GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, TRACE, PATCH};
我想为我的代码写接口,然后我就可以在我的代码中使用任何其他互联网库,只是写一个新的接口实现。因为我需要一些速度(这就是为什么我用C++写我的项目,因为在Python中,我尝试了它是缓慢的,即使使用最快的库),我想用CRTP写接口。
此外,我想使用模板的URL在运行时更少的分支,只是为每个HTTPRequestMethod编写特定的函数:
template <decltype(HTTPRequestMethods::GET) Method>
struct URL {
explicit URL(std::string web_url, std::string path) : web_url(web_url), path(path) {}
std::string web_url;
std::string path;
};
template <typename InterfaceImplementation>
struct InternetInterface {
template <decltype(HTTPRequestMethods::GET) HTTPRequestMethod>
std::string_view getBody(URL<HTTPRequestMethod> url) {
return static_cast<InterfaceImplementation>(this).getBody<HTTPRequestMethod>(url);
}
};
struct APIWrapper : InternetInterface<APIWrapper> {
...
template <decltype(HTTPRequestMethods::GET) HTTPRequestMethod>
std::string_view getBody(URL<HTTPRequestMethod> url_);
private:
...
};
// template specializations:
// for GET
template <>
std::string_view APIWrapper::getBody(URL<HTTPRequestMethods::GET> url) {
...
}
...
除了decltype(enum_name::any_value)
,还有其他方法可以获取枚举类型吗?
1条答案
按热度按时间ddrv8njm1#
回答您的问题-使用
decltype
是获取枚举类型的正确方法。TLDR
请记住,
decltype
会生成一个类型,在您的示例中,HTTPRequestMethods::GET
和HTTPRequestMethods::POST
的类型完全相同-它将是HTTPRequestMethods
。您可以使用
static_assert
和std::is_same_v
进行验证,如下所示:您需要的是非类型模板参数,而不是类型模板参数。下面是一个小示例:
这样一来,
URL<HTTPRequestMethods::GET>
和URL<HTTPRequestMethods::PUT>
就是不同的类型。由于它们是不同的类型,您可以提供标准重载: