C++ 将std::pair转换为包含任意数量元素的std::tuple

C++ 将std::pair转换为包含任意数量元素的std::tuple,c++,c++11,templates,variadic-templates,stdtuple,C++,C++11,Templates,Variadic Templates,Stdtuple,我需要将以下元代码从std::pair改编为std::tuple,包含任意数量的元素。我不想为每一个可能的元素单独实现它 template<typename A, typename B> struct merge_pairs { typedef std::pair< decltype(typename A::first() + typename B::first()), decltype(typename A::sec

我需要将以下元代码从
std::pair
改编为
std::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;
};
模板
结构合并对
{typedef std::pair<
decltype(typename A::first()+typename B::first()),
decltype(typename A::second()+typename B::second())
>类型;
};
选项#1
#包括
#包括
#包括
#包括
模板
结构合并元组
{
静态断言(标准::元组大小)

选项2
#包括
#包括
模板
结构合并元组;
模板
结构合并元组
{
静态断言(sizeof…(Ts)=sizeof…(Us),“!”;
使用类型=元组;
};

你可以使用可变模板。谷歌搜索。你应该提供一个完整但最少的示例来说明所需的行为。如果不编译,只要不编译的部分是你没有的部分就可以了。否则,确保它是完美的。:)您的问题可能因为没有显示您为解决问题所做的任何努力而结束。现在这是一个“为我做我的工作”的问题。您尝试了什么,在哪里遇到了问题?@Alf--示例实现始终存在(merge_pairs)@Alf--我知道我可以使用可变模板。但我不知道如何使用。这就是stackoverflow.com的用途,不是吗?第二个示例中的静态断言是什么?@ExcessPhase两个可变包的元素数应该相等。示例1使用的是未实现的函数,对吗?可爱!@ExcessPhase是的,使用的是函数(提供开箱即用的模板类型推断)通常比引入主模板然后提供专门化更简洁。由于该函数用于未计算的上下文(在
decltype
中),因此不需要正文
#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>{}));    
};
#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...>;
};