多继承Tuple(加快编译速度),实现按序号Get成员,按序号得到成员类型Type
#include <stdint.h>
#include <utility>
namespace NTuple
{
template<typename T, std::size_t index>
struct Elem
{
T value;
};
template<std::size_t index, typename T>
T& Get(Elem<T, index>& elem)
{
return elem.value;
}
template<std::size_t index, typename T>
const T& Get(const Elem<T, index>& elem)
{
return elem.value;
}
template<typename indexes, typename... T>
struct Tuple_i;
template<std::size_t... indexes, typename... T>
struct Tuple_i<std::integer_sequence<std::size_t, indexes...>, T...> :
Elem<T, indexes> ...
{};
template<std::size_t index, typename T>
Elem<T, index> _GetType(Elem<T, index>& elem);
template<typename... T>
struct Tuple : Tuple_i<std::make_index_sequence<sizeof...(T)>, T...>
{
template<std::size_t index>
using Type = decltype(decltype(_GetType<index>(*(Tuple*)0))::value);
template<std::size_t index>
const auto& Get() const { return NTuple::Get<index>(*this);}
template<std::size_t index>
auto& Get() { return NTuple::Get<index>(*this);}
};
}
using NTuple::Tuple;
using NTuple::Get;
#include <stdio.h>
#include <typeinfo>
int main()
{
Tuple<int, int, short, int, int, int, int, int, int, int, int, int, int, int, int, int, short> packs;
Get<0>(packs) = 2;
packs.Get<1>() = 3;
printf("%s", typeid(decltype(packs)::Type<0>).name());
return Get<0>(packs) + packs.Get<1>();
}