将fold表达式与std::一起用于两个元组
Using fold expression with std::apply on two tuples
我刚开始学习C++17倍表达式。我知道可以将fold表达式应用于元组,就像下面的例子一样(灵感来自对这个问题的回答(:
#include <iostream>
#include <tuple>
int main() {
std::tuple in{1, 2, 3, 4};
std::cout << "in = ";
std::apply([](auto&&... x) { ((std::cout << x << ' '), ...); }, in);
std::cout << std::endl;
std::multiplies<int> op;
auto out = std::apply([&](auto&& ...x) { return std::tuple{op(x, 3)...}; }, in);
std::cout << "out = ";
std::apply([](auto&&... x) { ((std::cout << x << ' '), ...); }, out);
std::cout << std::endl;
}
输出:
in = 1 2 3 4
out = 3 6 9 12
是否可以使用类似的方法将两个元组压缩在一起?参考上面的例子,我想用另一个元组来替换常数3,比如这个假设版本的std::apply:
auto out = std::apply([&](auto&& ...x, auto&& ...y) { return std::tuple{op(x, y)...}; }, inX, inY);
如果折叠表达式不适用于此目的,是否有其他方法可以在C++20中实现相同的结果(除了模板递归和/oriSFINAE(?
您可以apply
两次:
auto out = std::apply([&](auto&&... x){
return std::apply([&](auto&&... y){
return std::make_tuple(op(x, y)...);
}, inY);
}, inX);
或者,您可以使用索引序列,这在C++20中更容易,因为我们有更通用的lambda语法,尽管仍然相当密集:
auto out = [&]<size_t... Is>(std::index_sequence<Is...>){
return std::make_tuple(op(std::get<Is>(inX), std::get<Is>(inY))...);
}(std::make_index_sequence<std::tuple_size_v<decltype(inX)>>());
可能值得添加一个像。。。
auto indices_for = []<typename... Ts>(std::tuple<Ts...> const&){
return = []<size_t... Is>(std::index_sequence<Is...>){
return [](auto f) -> decltype(auto) {
return f(std::integral_constant<size_t, Is>()...);
};
}(std::index_sequence_for<Ts...>());
};
也就是说,indices_for(t)
为您提供了一个函数,该函数接受一个函数并用一组积分常数调用它。这是一个混乱,但它是一个烂摊子,你必须写一次,可以很容易地测试。这可以让你写:
auto out = indices_for(inX)([&](auto... Is){
return std::make_tuple(op(std::get<Is>(inX), std::get<Is>(inY))...);
});
类似的东西。
相关文章:
- 如何在C++中从两个单独的for循环中添加两个数组
- 在C++中,如何通过几种类型从元组中选择多个元素
- 将fold表达式与std::一起用于两个元组
- 返回两个向量 – 使用引用还是元组?
- 通过移动从两个向量创建元组向量
- 声明一个模板函数,将模板类友元的两个对象(仅)带到这两个专用化
- C++:合并两个以元组作为元素的向量
- 两个排版/元组中的常见类型
- 如何检查两个元组的所有成员是否不同
- 如何对两个容器元组进行排序?
- C 通过随机选择其元素从两个元组制成元组
- 如何将两个元组作为C 的参数发送
- 在 C++11 中加入两个元组
- 如何创建一个在 C++11 (STL) 中压缩两个元组的函数
- 成员初始值设定项列表:从返回元组的函数初始化两个成员
- 容易.快速比较两个 800k 每个元素数组的方法
- OpenGL:两个顶点数组 + 两个索引数组
- 通过两个交替元素来混合两个数组
- 如何绑定两个元组
- 如何使用boost元组返回两个向量