31 lines
911 B
C++
31 lines
911 B
C++
#pragma once
|
|
#include <utility>
|
|
#include "tuple.h"
|
|
namespace meta
|
|
{
|
|
namespace detail
|
|
{
|
|
template<typename T, typename ... Args, unsigned ... Indexes>
|
|
auto tuple_construct_helper(const std::tuple<Args...>& arg_tuple, std::index_sequence<Indexes...>)
|
|
{
|
|
return T{(std::get<Indexes>(arg_tuple))...};
|
|
}
|
|
}
|
|
template<typename T, typename ... Args>
|
|
constexpr auto tuple_construct(const std::tuple<Args...>& arg_tuple) noexcept
|
|
{
|
|
return detail::tuple_construct_helper<T>(arg_tuple, std::make_index_sequence < std::tuple_size_v<std::decay_t<decltype(arg_tuple)> >> {});
|
|
}
|
|
|
|
template<typename ... T1s, typename ...T2s>
|
|
struct tuple_join<std::tuple<T1s...>, std::tuple<T2s...>>
|
|
{
|
|
using type = std::tuple<T1s..., T2s...>;
|
|
};
|
|
|
|
template<typename ... Ts, template<typename ...> typename Wrap>
|
|
struct tuple_wrap<std::tuple<Ts...>, Wrap>
|
|
{
|
|
using type = std::tuple<Wrap<Ts>...>;
|
|
};
|
|
} |