代码之家  ›  专栏  ›  技术社区  ›  Tom Huntington

转换std::tuple的第i个元素

  •  0
  • Tom Huntington  · 技术社区  · 2 年前

    有什么简单的方法可以实现下面的伪代码吗?或者你会去一个模板元编程兔子洞?

    template <size_t index, typename Func, typename... Args>
    auto transform(std::tuple<Args...> tup, Func fn)
    {
        return std::tuple{ tup[0], ..., tup[index - 1], fn(tup[index]), ... };
    }
    
    1 回复  |  直到 2 年前
        1
  •  2
  •   康桓瑋    2 年前

    展开 tuple 使用模板lambda,并选择是否基于当前元素的索引应用该函数

    #include <tuple>
    
    template<size_t index, size_t I, typename Func, typename Tuple>
    auto transform_helper(Tuple& tup, Func& fn) {
      if constexpr (I < index)
        return std::get<I>(tup);
      else
        return fn(std::get<I>(tup));
    }
        
    template<size_t index, typename Func, typename... Args>
    auto transform(std::tuple<Args...> tup, Func fn) {
      return [&]<std::size_t... I>(std::index_sequence<I...>) {
        return std::tuple{transform_helper<index, I>(tup, fn)... };
      }(std::index_sequence_for<Args...>{});
    }
    

    Demo