c++ - 是否可以交错参数包?

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

是否有可能,使用 C++11/14/1z,有一个带有两个参数包的模板化结构,并在其中实例化一些其他的模板化结构,两个参数包是交错的?即如果第一个包是 T1_1、T1_2、T1_3,第二个包是 T2_1、T2_2 和 T2_3,交错包将是 T1_1、T2_1、T1_2、T2_2、T1_3、T2_3?我的猜测是“不”,因为省略号不能应用于两个参数包元素指示符;但也许某种元组构造或递归实例化技巧可以奏效?

编辑:让我明确地假设包具有相等的长度(sizeof... 值)。如果它不会使事情变得更加复杂,那么针对不同长度的包装的解决方案会很好。

最佳答案

这方面的所有单独部分实际上已经添加到标准中。我现在无法自行测试,但这个想法应该可行。

template <class Tuple1, class Tuple2, std::size_t ... indices>
auto interleave(Tuple1 t1, Tuple2 t2, std::integer_sequence<std::size_t, indices...>)
{
    return std::tuple_cat(std::make_tuple(std::get<indices>(t1),
                                          std::get<indices>(t2))...);
}


template <class Tuple1, class Tuple2>
auto interleave(Tuple1 t1, Tuple2 t2)
{
    return interleave(t1, t2, std::make_index_sequence<std::tuple_size<Tuple1>::value>());
}

关于c++ - 是否可以交错参数包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37976525/

相关文章:

c++ - 我的 C++ 代码在宏+模板编译时失败,为什么会出现这个错误?

c++ - 追踪 shared_ptr 的所有者?

C++11线程修改std::list

c++ - 为什么总和为0?

c++ - 为什么我的模板参数包不起作用?

c++ - 使用 std::copy 从随机数分布中复制

c++ - GCC 原子 shared_ptr 实现

c++ - Linux c++ 可移植二进制问题

C++ 沙盒动态库

c++ - 哪种音频文件格式最容易操作?