具有切换模板参数的别名模板

Alias template with a switch over template parameters

提问人:francesco 提问时间:1/12/2023 最后编辑:francesco 更新时间:1/12/2023 访问量:98

问:

考虑别名模板声明,具体取决于可以具有有限数量值的单个模板参数,例如 . 我想使用 use 为 的每个值定义一个类型别名。class enumclass 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 colorstd::conditionalclass enum

template <class c>
using data = some_struct<c, A, B, C>;

其中,根据第一个参数 c “选择”类型 A、B、C。some_struct

我怎样才能实现它(以可扩展的方式)?

C++ 模板 类型别名枚 举类

评论

0赞 dfrib 1/12/2023
并不是说这是一个别名模板,而不是一个 using 指令。
0赞 463035818_is_not_an_ai 1/12/2023
您总是在 和 之间进行选择,如果添加一个值,则添加一个 ?还是任何 3 种类型?我不确定这是你想要的,还是只是你试图得到的?ABCDsome_structdata
0赞 francesco 1/12/2023
@dfrib正确,我更改了标题和文本
0赞 francesco 1/12/2023
@463035818_is_not_a_number我打算添加一个新的颜色元素 x,以及一个相应的 ,使得 .struct Ddata<x> = D

答:

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_setcolordata_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; }
// ...

然后,添加映射到新类型的新枚举只是添加专用化