使用任意数量的元素将 std::pair 转换为 std::tuple
Transform std::pair to std::tuple with any number of elements
我需要以下从 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;
};
选项 #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>{}));
};
选项 #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...>;
};
我需要以下从 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;
};
选项 #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>{}));
};
选项 #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...>;
};