C++如何获取枚举类型

bmvo0sr5  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(181)

我有这样的枚举:

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),还有其他方法可以获取枚举类型吗?

ddrv8njm

ddrv8njm1#

回答您的问题-使用decltype是获取枚举类型的正确方法。

TLDR

请记住,decltype会生成一个类型,在您的示例中,HTTPRequestMethods::GETHTTPRequestMethods::POST的类型完全相同-它将是HTTPRequestMethods
您可以使用static_assertstd::is_same_v进行验证,如下所示:

static_assert(std::is_same_v<decltype(HTTPRequestMethods::GET), HTTPRequestMethods>,
                  "This should be the same");
static_assert(std::is_same_v<decltype(HTTPRequestMethods::PATCH), HTTPRequestMethods>,
                  "This should be the same");

您需要的是非类型模板参数,而不是类型模板参数。下面是一个小示例:

template <HTTPRequestMethods Method>
struct URL {
    std::string web_url;
    std::string path;
};

template <>
struct URL<HTTPRequestMethods::PUT> {
    std::string put_only;
};

这样一来,URL<HTTPRequestMethods::GET>URL<HTTPRequestMethods::PUT>就是不同的类型。由于它们是不同的类型,您可以提供标准重载:

void print_url(const URL<HTTPRequestMethods::GET>& url) {
    std::cout << "web_url = " << url.web_url << "\n";
    // (...)
}

void print_url(const URL<HTTPRequestMethods::PUT>& url) {
    std::cout << "put_only = " << url.put_only << "\n";
    // (...)
}

相关问题