提问人:francesco 提问时间:1/12/2023 最后编辑:francesco 更新时间:1/12/2023 访问量:98
具有切换模板参数的别名模板
Alias template with a switch over template parameters
问:
考虑别名模板声明,具体取决于可以具有有限数量值的单个模板参数,例如 .
我想使用 use 为 的每个值定义一个类型别名。class enum
class enum
一种实现方法是使用:std::conditional
class enum color { white, red, blue };
struct A {};
struct B {};
struct C {};
template <color c>
using data = std::conditional_t<c == color::white, A, std::conditional_t<c == color::red, B, C>>;
显然,当 扩展到新值时,需要一个额外的嵌套 ,这相当麻烦。
我正在寻找一种解决方案,以“可扩展”的方式表达这一点,也就是说,在扩展时,必须做最少的工作。
类似的东西class enum color
std::conditional
class enum
template <class c>
using data = some_struct<c, A, B, C>;
其中,根据第一个参数 c “选择”类型 A、B、C。some_struct
我怎样才能实现它(以可扩展的方式)?
答:
2赞
NathanOliver
1/12/2023
#1
一种方法是创建一个要从中选取的类型的元组,并将其与你拥有的枚举的顺序相匹配。然后,您可以从枚举值索引处的元组中获取类型。那看起来像
using type_set = std::tuple<A, B, C>;
template <color c>
using data_t = typename std::tuple_element<static_cast<size_t>(c), type_set>::type;
现在,您需要做的就是将类型添加到元组中,该元组在向 中添加枚举时定义。您可以在此实时示例中看到它的工作原理,该示例使用错误消息来告诉您解析为类型的内容。type_set
color
data_t<color::red>
B
1赞
463035818_is_not_an_ai
1/12/2023
#2
您可以使用专业化。主要和助手:
template <color c> struct data;
template <color c> using data_t = data<T>::type;
然后,对于每种情况,都要编写一个专业:
template <> struct data<color::white> { using type = A; }
template <> struct data<color::red> { using type = B; }
// ...
然后,添加映射到新类型的新枚举只是添加专用化
评论
A
B
C
D
some_struct
data
struct D
data<x> = D