c++ - 使用 make_tuple 方法获取元组和 func 并返回映射元组的最简单方法

标签 c++ template-meta-programming stdtuple

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

例如:

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

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

最佳答案

一种可能的方法是使用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

关于c++ - 使用 make_tuple 方法获取元组和 func 并返回映射元组的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50689685/

相关文章:

c++ - SFML 正在做一些与 vector 数组非常相关的事情

C++如何实现从类型到类型的编译时映射?

c++ - 在自定义迭代器中包装 STL 容器的最佳方法是什么?

c++ - 运行任何带有一半参数的仿函数

C++: move/转发/右值委托(delegate)恶作剧

c++ - 替代网络框架上的显式实例化

c++ - 基本 C++ : for-each loop

c++ - 容器模板参数 std::map 或 std::vector

c++ - 对或元组值的名称别名引用

c++ - std::tie 语法不清晰