如何将二维元组 [x][y] 转换为 [y][x] 并为每个结果集调用可变参数函数
How to transform 2D tuple [x][y] to [y][x] and call variadic function for each result set
我想“旋转”二维元组的轴并为每个结果集调用可变参数函数。
所有元组元素都具有相同的类型,但元素 items/attributes 可能具有不同的类型。
从
开始
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);
我试图在 lambda
中使用 std::get<index>(tuple)
来解决这个问题,使用 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);
我想“旋转”二维元组的轴并为每个结果集调用可变参数函数。
所有元组元素都具有相同的类型,但元素 items/attributes 可能具有不同的类型。
从
开始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);
我试图在 lambda
中使用 std::get<index>(tuple)
来解决这个问题,使用 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);