首页 > 解决方案 > 使用 make_tuple 方法获取元组和函数并返回映射元组的最简单方法

问题描述

我一直在寻找这个主题,但未能找到任何令人满意的答案。我正在寻找一种方法来做大多数高级语言已经可以做的事情,采用一个元组和一个映射方法并返回一个映射的(也就是转换的)元组。理想情况下,这将在 c++14 中工作,但如果需要,c++17 也可以。

例如:

auto new_tuple = awesome_make_tuple( curtuple, []( auto & v ) { return v - 1; } )

类型可以不同,但​​提供的方法必须适用于任何给定类型。(Q方,该方法可以以某种方式模板化吗?)

标签: c++template-meta-programmingstdtuple

解决方案


一种可能的方法是使用std::apply解包元组并应用f每个解包的元素,并重建一个元组。就像是:

template <typename Tuple, typename F>
auto tuple_map(const Tuple& t, F f) {
  return std::apply([&](auto... args) { return std::make_tuple(f(args)...); }, t);
}

示例用法:

auto t = std::make_tuple(1, 2, 3);
auto mapped = tuple_map(t, [](auto x) { return x - 1; });
std::cout << std::get<0>(mapped) << ' '
          << std::get<1>(mapped) << ' '
          << std::get<2>(mapped) << '\n';
  // prints 0 1 2

推荐阅读