如何在参数包的所有元素之间插入类型?

How to insert a type between all elements of a parameter pack?

我有:

struct spacer : foo<bar>{};

struct sequence : baz<qux, spacer, quz, spacer, plugh>{};

我希望能够写(类似这样的东西,确切的语法无关紧要):

struct spaced_sequence : SPACED_BAZ<qux, quz, plugh>{};

这可以用 macros/templates/anything else 来完成吗?

你可以这样做(假设知道参数的数量):

template <class T1, class T2, class T3>
using SPACED_BAZ = baz<T1, spacer, T2, spacer, T3>;

如果类型较多,可以根据需要做其他别名

您可以执行以下操作:

创建一个基本案例函数模板,将单个类型 T 附加到 baz

的某些特化
template<typename T, typename ... Args>
auto append(baz<Args...>) -> baz<Args..., T>;

请注意,这里没有添加 spacer,因为 T 是我们添加的最后一个类型。

然后编写一个递归案例,也作为函数模板,如果至少还有 2 种类型 T1T2 需要添加

,则调用它
template<typename T1, typename T2, typename ...Rest, typename ... Args>
auto append(baz<Args...>) 
  -> decltype(append<T2, Rest...>(std::declval<baz<Args..., T1, spacer>>()));
                                      // insert spacer after T1 ^
                  // ^ pass the remaining types recursively

最后添加一个方便的别名

template<typename ...Ts>
using SPACED_BAZ = decltype(append<Ts...>(std::declval<baz<>>()));
                   // types to add ^  and baz is empty to start

这里是 demo