【问题标题】:Transform std::pair to std::tuple with any number of elements将 std::pair 转换为具有任意数量元素的 std::tuple
【发布时间】:2016-08-14 01:09:56
【问题描述】:

我需要以下从std::pairstd::tuple 的元代码,其中包含任意数量的元素。我不想为每个可能的元素数量单独实现它。

template<typename A, typename B>
struct merge_pairs
{       typedef std::pair<
            decltype(typename A::first() + typename B::first()),
            decltype(typename A::second() + typename B::second())
        > type;
};

【问题讨论】:

  • 您可以使用可变参数模板。谷歌它。
  • 您应该提供一个完整但最小的示例来举例说明所需的行为。只要不编译的部分是您没有的部分,它不编译就可以。确保否则它是完美的。 :)
  • 您的问题可能已关闭,因为它没有显示您为解决问题所做的任何努力。现在这是一个“为我做我的工作”的问题。你尝试了什么,你在哪里卡住了?
  • @Alf -- 示例实现始终存在(merge_pairs)。
  • @Alf -- 我知道我可以使用可变参数模板。但我不知道怎么做。这就是 stackoverflow.com 的用途,不是吗?

标签: c++ c++11 templates variadic-templates stdtuple


【解决方案1】:

选项 #1

#include <cstddef>
#include <type_traits>
#include <utility>
#include <tuple>

template <typename A, typename B>
struct merge_tuples
{
    static_assert(std::tuple_size<A>::value == std::tuple_size<B>::value, "!");

    template <std::size_t... Is>
    static auto merge(std::index_sequence<Is...>) noexcept
        -> std::tuple<typename std::decay<decltype(std::declval<typename std::tuple_element<Is, A>::type>()
                                                 + std::declval<typename std::tuple_element<Is, B>::type>())
                               >::type...>;

    using type = decltype(merge(std::make_index_sequence<std::tuple_size<A>::value>{}));    
};

DEMO

选项 #2

#include <type_traits>
#include <utility>

template <typename A, typename B>
struct merge_tuples;

template <template <typename...> class Tuple, typename... Ts, typename... Us>
struct merge_tuples<Tuple<Ts...>, Tuple<Us...>>
{
    static_assert(sizeof...(Ts) == sizeof...(Us), "!");

    using type = Tuple<typename std::decay<decltype(std::declval<Ts>()
                                                  + std::declval<Us>())
                                >::type...>;
};

DEMO 2

【讨论】:

  • 第二个例子中的static_assert是干什么用的?
  • @ExcessPhase 两个可变参数包的元素数量应该相等
  • 示例 1 使用了一个未实现的函数,对吧?可爱!
  • @ExcessPhase 是的,使用函数(提供开箱即用的模板类型推断)通常比引入主模板然后提供专业化更简洁。由于该函数在未评估的上下文中使用(在decltype 内),因此您不需要正文
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-07
  • 2014-08-31
  • 2022-01-11
相关资源
最近更新 更多