【问题标题】:Simplest way to have a make_tuple method to take a tuple and func and return a mapped tuple使用 make_tuple 方法获取元组和函数并返回映射元组的最简单方法
【发布时间】:2018-06-04 22:35:56
【问题描述】:

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

例如:

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

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

【问题讨论】:

  • 你希望函数如何应用于原始元组?
  • 不完全是,我看到了一个,但它需要您预先定义输出元组。就我而言,我可能无法轻松声明输出类型

标签: c++ template-meta-programming stdtuple


【解决方案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

【讨论】:

    【解决方案2】:
    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) );
    }
    

    中只写notstd::apply。有点烦人,但是在 SO 上有几十个实现。

    【讨论】:

      【解决方案3】:

      在玩了一会儿之后,我想出了这个最简单的方法(在 c++14 中工作)。感谢您让我朝着正确的方向前进:

      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>() );
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-24
        • 1970-01-01
        • 2013-02-12
        • 2018-06-07
        • 1970-01-01
        • 2018-04-07
        • 2013-05-27
        • 1970-01-01
        相关资源
        最近更新 更多