如何将二维元组 [x][y] 转换为 [y][x] 并为每个结果集调用可变参数函数

克里斯·G。

我想“旋转”二维元组的轴并为每个结果集调用一个可变参数函数。

所有元组元素都具有相同的类型,但元素项/属性可能具有不同的类型。

从...开始

constexpr auto someData = std::make_tuple(
    std::make_tuple(1, 2, 3.0),
    std::make_tuple(4, 5, 6.0),
    std::make_tuple(7, 8, 9.0));

我想要实现的结果是调用这样的可变参数函数

 someFunction(1, 4, 7);
 someFunction(2, 5, 8);
 someFunction(3.0, 6.0, 9.0);

我试图解决这个问题,使用std::get<index>(tuple)alambda创建索引std::make_index_sequence并调用可变参数函数,通过 传递元组元素std::apply,就像这样(没有成功)。

#include <iostream>
#include <tuple>
constexpr auto someFunction(auto&&... args) {
    //do some stuff
    ((std::cout << args),...);
}
int main() {
    constexpr auto someData = std::make_tuple(
        std::make_tuple(1, 2, 3.0),
        std::make_tuple(4, 5, 6.0),
        std::make_tuple(7, 8, 9.0)
    );

    // want to get
    // someFunction(1, 4, 7);
    // someFunction(2, 5, 8);
    // someFunction(3.0, 6.0, 9.0);

    using t0_t = typename std::tuple_element<0, decltype(someData)>::type;
    [] <std::size_t... I> (auto&& tuple, std::index_sequence<I...>) {
        ([&] (std::size_t i) {
            std::apply([&](auto&&... args) {
                //(std::get<i>(args), ...);
                // someFunction ((std::get<i>(args), ...));
            }, tuple);
        }(I), ...);
    }(std::forward<decltype(someData)>(someData),
        std::make_index_sequence<std::tuple_size<t0_t>::value>{});
}

如何正确地做到这一点?

康桓瑋

使用嵌套的 lambda,一个扩展索引,一个扩展tuple

constexpr auto someData = std::make_tuple(
  std::make_tuple(1, 2, 3.0),
  std::make_tuple(4, 5, 6.0),
  std::make_tuple(7, 8, 9.0)
);

// someFunction(1, 4, 7);
// someFunction(2, 5, 8);
// someFunction(3.0, 6.0, 9.0);

std::apply([](auto first_tuple, auto... rest_tuples) {
  [&]<std::size_t... I>(std::index_sequence<I...>) {
    ([]<size_t N>(auto... tuples) {
      someFunction(std::get<N>(tuples)...);
    }.template operator()<I>(first_tuple, rest_tuples...), ...);
  }(std::make_index_sequence<std::tuple_size_v<decltype(first_tuple)>>{});
}, someData);

演示

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章