如何在参数包的所有元素之间插入类型?
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 种类型 T1
和 T2
需要添加
,则调用它
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。
我有:
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 种类型 T1
和 T2
需要添加
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。