首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >让make_tuple方法接受元组和函数并返回映射的元组的最简单方法

让make_tuple方法接受元组和函数并返回映射的元组的最简单方法
EN

Stack Overflow用户
提问于 2018-06-05 06:35:56
回答 3查看 64关注 0票数 1

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

例如:

代码语言:javascript
复制
auto new_tuple = awesome_make_tuple( curtuple, []( auto & v ) { return v - 1; } )

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

EN

回答 3

Stack Overflow用户

发布于 2018-06-05 06:46:50

一种可能的方法是使用std::apply解压元组,并对每个解压的元素应用f,然后重新构建元组。类似于:

代码语言:javascript
复制
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);
}

示例用法:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2018-06-05 06:50:28

代码语言:javascript
复制
template<class F>
auto tupler(F&&f){
  return [f=std::forward<F>(f)](auto&&...args)mutable{
    return std::make_tuple( f(decltype(args)(args))... );
  };
}
template<class F, class Tup>
auto map_tuple( F&& f, Tup&& tup ){
  return std::apply( tupler(std::forward<F>(f)), std::forward<Tup>(tup) );
}

c++14中,只需编写notstd::apply即可。这有点烦人,但在SO上有几十个实现。

票数 1
EN

Stack Overflow用户

发布于 2018-06-05 22:58:28

在尝试了更多之后,我认为这是最简单的方法(适用于c++14 )。感谢你把我引向正确的方向:

代码语言:javascript
复制
template<typename T, typename F, size_t...indices>
auto map_impl( T && in, F && f, std::index_sequence<indices...> )
{
    return std::make_tuple( f( std::get<indices>( in ) )... );
}

template<typename T, typename F>
auto map( T && in, F && f )
{
    const size_t sz = std::tuple_size<std::decay_t<T>>::value;
    return map_impl( std::forward<T>( in ), std::forward<F>( f ), std::make_index_sequence<sz>() );
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50689685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档