连接元组的条目

分享于2022年07月17日 c++ tuples 问答
【问题标题】:Concatenate entries of tuples连接元组的条目
【发布时间】:2022-07-15 18:12:05
【问题描述】:

我有两个这样的元组

std::tuple, std::vector> t1; 
std::tuple, std::vector> t2; 

我现在想连接元组的条目(这样我就有一个元组包含两个向量以及元组的第一个/第二个向量的条目)。如果 tuple 发生了变异也没关系。

我可以这样做:

std::get<0>(t1).insert(std::get<0>(t1).end(), std::get<0>(t2).begin(), std::get<0>(t2).end());

对于每个条目,但如果我在元组中有很多 if 条目,它会变得非常难看。

因为 std::get 需要一个常量,所以用普通的 for 循环迭代元组是行不通的。我没有让它与 std::apply 一起工作,因为只能传递一个参数。

  • 请说明“有多个条目”的含义。 @kiner_shah

【解决方案1】:

使用嵌套折叠表达式,一个扩展 tuple ,一个扩展 tuple 的元素

#include 
#include 

template
void concatenate(FirstTuple& first, const RestTuples&... rest) {
  constexpr auto N = std::tuple_size_v;
  static_assert(((N == std::tuple_size_v) && ...));
  [&](std::index_sequence) {
    ([&](const auto& other) { 
      (std::get(first).insert(
        std::get(first).end(),
        std::get(other).begin(),
        std::get(other).end()), ...);
    }(rest), ...);
  }(std::make_index_sequence{});
}

Demo

【讨论】: