扩展包含 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 上有很多实现。
我有一个可变模板类型,看起来像
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 上有很多实现。