【问题标题】:Folding a parameter pack of N types into N-1 pairs将 N 类型的参数包折叠成 N-1 对
【发布时间】:2018-02-25 01:58:01
【问题描述】:

我正在尝试将N 不同类型的参数包折叠成具有各自类型的std::tupleN-1 std::pairs

例如表达式

ResolveToTupleOfPairs<void, int, long>::Type tuple;

应该评估为

std::tuple<std::pair<void, int>, std::pair<int, long>> tuple;

所以我正在寻找ResolveToTupleOfPairs 类型的实现,以按照解释折叠参数包。我当前的实现如下,但显然它导致类型是一对元组,每个对都持有相同类型两次,而不是&lt;T0, T1&gt;, &lt;T1, T2&gt;, ...

template<typename... T>
struct ResolveToTupleOfPairs {
    static_assert(sizeof...(Args) > 1, "need at least two arguments");

    using Type = std::tuple<std::pair<T, T>...>;
};

c++17 解决方案我很好。

【问题讨论】:

  • voidstd::pair?
  • @max66 只是一个示例类型来说明我的示例。

标签: c++ c++11 c++17


【解决方案1】:

我们利用了参数包扩展真的很聪明的事实

template<typename...>
struct fold;

template<size_t... Is, typename... Ts>
struct fold<std::index_sequence<Is...>, Ts...>
{
    using tuple = std::tuple<Ts...>;
    using type = std::tuple<std::pair<std::tuple_element_t<Is, tuple>,
                                      std::tuple_element_t<Is + 1, tuple>>...>;
};

template<typename... Ts>
using fold_t = typename fold<std::make_index_sequence<sizeof...(Ts) - 1>, Ts...>::type;

Live

【讨论】:

  • 大量使用std_tuple_element;我正在研究解决方案,但您的回答要好得多。
  • @Passer 感谢您提供出色的解决方案,请参阅this followup question
猜你喜欢
  • 1970-01-01
  • 2010-12-14
  • 2013-12-08
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2019-09-03
  • 2011-08-09
  • 2016-09-09
相关资源
最近更新 更多