gpt4 book ai didi

c++ - 如何将枚举模板映射到类型模板?

转载 作者:行者123 更新时间:2023-12-05 00:52:58 25 4
gpt4 key购买 nike

我有一个模板函数,目前看起来像这样:

#include <string>

enum class Enum { EVENT_ONE, EVENT_TWO };

template<Enum e, typename T>
void MyFunc() { }

int main(int argc, const char* argv[])
{
MyFunc<Enum::EVENT_ONE, int>();
MyFunc<Enum::EVENT_TWO, std::string>();
}

我想在 enum classtypename 模板 之间创建一些常量映射,以使其更简单。

理想情况下,此方法应该只获取枚举作为模板,并且类型名模板将使用预定义的映射以某种方式解析。

int main(int argc, const char* argv[])
{
MyFunc<Enum::EVENT_ONE>();
MyFunc<Enum::EVENT_TWO>();
}

在现代 C++(C++17 或 C++20)中是否可行?

最佳答案

您可以编写 enum_to_type 特征并相应地对其进行专门化:

#include <string>

enum class Enum { EVENT_ONE, EVENT_TWO };


template <Enum e> struct enum_to_type;
template <> struct enum_to_type<Enum::EVENT_ONE> { using type = int; };
template <> struct enum_to_type<Enum::EVENT_TWO> { using type = std::string; };
// ... maybe more specializations ...


template<Enum e>
void MyFunc() {
using T = typename enum_to_type<e>::type;
}

int main(int argc, const char * argv[]) {
MyFunc<Enum::EVENT_ONE>();
MyFunc<Enum::EVENT_TWO>();
}

除了作用域枚举之外,这在 C++98 中应该已经可以了。从 C++11 开始,您可以使用别名模板为它增添趣味:

template <Enum e>
using enum_to_type_t = typename enum_to_type<e>::type;

这将在使用 trait 时减少困惑的语法:

void MyFunc() {
using T = enum_to_type_t<e>;
}

关于c++ - 如何将枚举模板映射到类型模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68744868/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com