展开包含int pack的类型

时间:2015-08-22 10:17:24

标签: c++ templates c++11 metaprogramming variadic-templates

我有一个类似于

的可变参数模板类型
<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

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上就有很多实现。