我有一个类似于
的可变参数模板类型<LinearLayout>
我现在想要使用int pack调用函数template <int... Args> struct int_pack
{
using type = int_pack<Args...>;
};
(例如Func
),以便我使用int_pack<0, 1, 2>
而不是Func
调用Func(0, 1, 2)
}。
编辑1:我不能/不想真正编辑Func(int_pack<0, 1, 2>{})
,因为我不知道。这里的上下文是,我有另一个函数(例如Func
):
Wrap
(而不是template <typename Func, int N> auto Wrap(Func func)
{
return func(?int_pack<N>?);
}
我想扩展包装)
编辑2 /动机:我目前有一个功能?int_pack<N>?
:
WrapSingle
template <typename Func, typename... Indices> auto WrapSingle(Func func, Indices... indices)
{
return func(Get(indices)...);
}
只是另一个功能。
现在而不是double Get(int)
我想写WrapSingle(func, 0, 1, 2)
/ Wrap<2>(func)
Wrap(func, 2)
通过2
扩展到0, 1, 2
。
答案 0 :(得分:2)
只需编写一个带有int_pack
并转发其模板参数的重载:
template <int... Args>
void Func(int_pack<Args... > ) {
Func(Args...);
}
答案 1 :(得分:1)
template <typename Func, int... Args N>
auto Wrap(Func func, int_pack<Args...>)
{
return func(Get(Args)...);
}
template <typename Func, int N>
auto Wrap(Func func)
{
return Wrap(std::move(func), make_int_pack<N>());
}
make_int_pack
基本上是std::make_integer_sequence
。看起来你正在使用C ++ 14,所以只需使用它和std::integer_sequence
而不是你的自定义类型。如果您坚持使用C ++ 11,那么SO上就有很多实现。