c++11 一个简易的tuple实现(二)

2014-03-10 12:52:42 · 作者: · 浏览: 140

 

  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;

  }