打包元组及其索引范围
Pack tuple with its index range
我想知道是否有办法将元组与其索引范围打包(可能使用 std::index_sequence
(。基本上,我想要实现的是
template <typename... Us, std::size_t... Idx>
void func(??? arg_pack) {
// std::get<Idx>(std::move(arg_pack.args))...
}
以下内容不起作用,但说明了我的意图。
template <typename... Us, std::size_t... Idx>
struct arg_pack {
std::tuple<Us...> args;
std::index_sequence<Idx...> idx;
};
更新:
这是我在示例使用中实际采用的解决方案。希望这能更清楚地说明我的意图。
双可变参数列表存在常见问题:在可变参数的末尾只能有一个。
我建议将索引列表打包成一种类型(通常的std::index_sequence
(并将其放在首位。
我的意思是,类似的东西
template <typename...>
struct arg_pack;
template <std::size_t ... Is, typename ... Ts>
struct arg_pack<std::index_sequence<Is...>, Ts...>
{
static_assert( sizeof...(Is) == sizeof...(Ts) , "!" );
std::tuple<Ts...> args;
std::index_sequence<Is...> idx;
};
所以func()
可以写成如下
template <std::size_t ... Is, typename ... Ts>
void func (arg_pack<std::index_sequence<Is...>, Ts...> && ap)
{
using unused = int[];
(void)unused { 0, (std::get<Is>(std::move(ap.args)), 0)... };
}
我还建议声明(不是定义,以std::declval()
的方式......但您也可以创建一个make_arg_pack()
,以从declArgPack()
函数的Ts...
值(列表开始创建对象
template <typename ... Ts>
arg_pack<std::make_index_sequence<sizeof...(Ts)>, Ts...> declArgPack ();
简化类型的创建以及模板using
类型的定义,以简化declArgPack()
的使用
template <typename ... Ts>
using arg_pack_type = decltype(declArgPack<Ts...>());
以下是完整的工作示例
#include <tuple>
#include <type_traits>
template <typename...>
struct arg_pack;
template <std::size_t ... Is, typename ... Ts>
struct arg_pack<std::index_sequence<Is...>, Ts...>
{
static_assert( sizeof...(Is) == sizeof...(Ts) , "!" );
std::tuple<Ts...> args;
std::index_sequence<Is...> idx;
};
template <typename ... Ts>
arg_pack<std::make_index_sequence<sizeof...(Ts)>, Ts...> declArgPack ();
template <typename ... Ts>
using arg_pack_type = decltype(declArgPack<Ts...>());
template <std::size_t ... Is, typename ... Ts>
void func (arg_pack<std::index_sequence<Is...>, Ts...> && ap)
{
using unused = int[];
(void)unused { 0, (std::get<Is>(std::move(ap.args)), 0)... };
}
int main ()
{
arg_pack_type<short, int, long, long long> ap0;
func(std::move(ap0));
}
相关文章:
- 并行用于C++17中数组索引范围内的循环
- C++ - 成功打印超出范围的字符串索引
- 张量不会在超出范围索引时引发异常
- 如何在一定范围内将无锁更新索引设置为最大值
- 为什么 std::string 在索引超出范围时不自动追加(或崩溃)?
- 向量下标出的范围错误.即使向量的索引大于访问数据的索引,也会发生误差
- 打包元组及其索引范围
- 如何在 C++ 的字符串中打印从一个索引到另一个索引的字符范围
- 绑定或色谱柱索引超出范围Sqlite C
- 具有多维数组的索引范围之外的索引是不确定的
- 如何在向量的给定索引范围内查找最小元素
- 如何跳过基于"索引"的基于范围的 for 循环中的元素?
- 阵列索引(转换为整数)用范围枚举
- 为什么在 std::vector 中使用索引超出范围的运算符 [] 时没有出现异常?
- 范围循环中的访问索引
- 使用迭代器的矢量擦除特定索引(不基于范围或条件)
- 在向量的排序向量中查找特定值的索引范围
- 请解释 for 循环索引的范围
- 指定索引范围
- 对复杂度为0(1)的索引范围内的值求和