将std :: pair转换为具有任意数量元素的std :: tuple

问题描述 投票:-5回答:1

我需要以下从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;
};
c++ c++11 templates variadic-templates stdtuple
1个回答
2
投票

选项#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

© www.soinside.com 2019 - 2024. All rights reserved.