扩展包含 int 包的类型

Expand a type containing an int pack

我有一个可变模板类型,看起来像

template <int... Args> struct int_pack
{
    using type = int_pack<Args...>;
};

我现在想用一个 int 包调用一个函数 Func(例如 int_pack<0, 1, 2>),这样我就用 Func(0, 1, 2) 调用 Func 而不是 Func(int_pack<0, 1, 2>{}).

编辑 1: 我不能t/don真的不想编辑 Func 因为我不知道。这里的上下文是,我有另一个功能(例如 Wrap):

template <typename Func, int N> auto Wrap(Func func)
{
    return func(?int_pack<N>?);
}

(而不是 ?int_pack<N>? 我想扩展包)

编辑 2/动机: 我目前有一个函数 WrapSingle

template <typename Func, typename... Indices> auto WrapSingle(Func func, Indices... indices)
{
    return func(Get(indices)...);
}

double Get(int)只是另一个功能。

现在我想写 Wrap<2>(func)/Wrap(func, 2) 而不是 WrapSingle(func, 0, 1, 2),其中 2 通过 int_pack 扩展为 0, 1, 2

只需编写一个重载,它接受一个 int_pack 并沿其模板参数转发:

template <int... Args>
void Func(int_pack<Args... > ) {
    Func(Args...);
}
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 上有很多实现。