如何将元组元组中的数据分组为向量元组

How to group data in tuples of tuples into a tuple of vectors

我想将元组中的元组数据分组为向量元组。 给定的是包含数据的元组的元组。有多个重复类型,即数据应分组到每个唯一类型的向量中。

到目前为止 boost::mp11 是我找到的最优雅的构建类型的方法 std::tuple<std::vector<T1>, std::tuple<std::vector<T2>, ...> 基于传入的参数包 std::tuple<std::tuple<some_data>, std::tuple<std::tuple<some_more_data>, ... 使用 mp_uniquemp_transform 获取每个唯一类型的向量。

如果您知道 std:: 左右的替代方案(可选),我们会很高兴。

我无法找到将元组元素填充到匹配向量中的方法? 我会很兴奋,找到一个类似折叠表达式的方式来做到这一点。

这个例子应该有助于更好地理解我的想法。

template <typename T> using vector_of = std::vector<T>;

static constexpr auto tuple_to_vector(auto&&... Vs) noexcept {
    // merged_tuple = std::tuple<int, double, int, char, int, float, char, float, double>
    auto merged_tuple = std::tuple_cat(std::forward<decltype(Vs)>(Vs)...);
  
    // vector_t = std::tuple<std::vector<int>, std::vector<double>, std::vector<char>, std::vector<float>>
    using vector_t = boost::mp11::mp_transform<vector_of, boost::mp11::mp_unique<decltype(merged_tuple)>>; 
    vector_t vec;

    // how to add merged_tuple elements to vec
    // resulting in
    // std::tuple< std::vector<int>{1,3,2}, std::vector<double>{2.0,3.0}, std::vector<char>{'b','c'}, std::vector<float>{3.0f,2.0f}>
  
    return std::move(vec);
    
};

int main() {
    constexpr auto vec = tuple_to_vector(
        std::make_tuple(1,2.0,3),
        std::make_tuple('b',2,3.0f),
        std::make_tuple('c',2.0f,3.0)
    );
    // expecting
    // vec = std::tuple<
    //  std::vector<int>{1,3,2},
    //  std::vector<double>{2.0,3.0},
    //  std::vector<char>{'b','c'},
    //  std::vector<float>{3.0f,2.0f}
    // >
    return 42;
}

可以用std::apply展开merged_tuple的元素,用std::get根据类型提取vector_t中对应的vector的元素,并填充到 vectorpush_back

std::apply([&vec](auto... args) {
   (std::get<std::vector<decltype(args)>>(vec).push_back(args), ...);
}, merged_tuple);

Demo

注意 vec even in C++20 since its allocation is non-transient. If you really want to construct a constexpr tuple, then you can use std::array since the size of the array can be obtained at compile time. Here is a demo 将结果 vec 转换为相应的 std::array 类型。