template<unsigned int N, typename… TList> struct tuple_helper;
template<unsigned int N, typename T, typename… TList>
struct tuple_helper<N, tuple<T, TList…》
{
typedef tuple<T, TList…> tuple_type;
typedef typename tuple_at<N, tuple_type>::tuple_type base_tuple_type;
typedef typename tuple_at<N, tuple_type>::value_type return_type;
constexpr static const return_type& get(const tuple_type& tuple_)
{
return static_cast<const base_tuple_type&>(tuple_)。head();
}
static void get(const nulltuple& tuple_) {}
};
//////////////////////////////////////////////////////////
template<unsigned int N, typename… TList>
constexpr const typename tuple_at<N, tuple<TList…> >::value_type&
tuple_get(const tuple<TList…>& tuple_)
{
return tuple_helper< N, tuple<TList…> >::get(tuple_);
}
例子:
#include "TypeTuple.h"
#include <tuple>
int main()
{
bool b;
tuple<int, float, char> pp = {10, 0.1234, 'a'};
b = std::is_same<tuple_at<2, tuple<int, float, char》::value_type, char >::value;
std::cout 《 "is same: " 《 b 《 std::endl;
b = std::is_same<tuple_at<2, tuple<int, float, char》::tuple_type, tuple<char> >::value;
std::cout 《 "is same: " 《 b 《 std::endl;
std::cout 《 tuple_get<0>(pp)《" "《 tuple_get<1>(pp) 《" "《tuple_get<2>(pp) 《 std::endl;
std::tuple<int, float, char> cc{10, 0.1234, 'a'};
std::cout 《 sizeof(pp) 《 " " 《 sizeof(cc) 《 std::endl;
tuple<int, float, char> ppc = pp;
std::cout 《 tuple_get<0>(ppc)《" "《 tuple_get<1>(ppc) 《" "《tuple_get<2>(ppc) 《 std::endl;
return 0;
}