std::tuple_element need deep template instantination

前端 未结 3 535
面向向阳花
面向向阳花 2020-12-11 11:52

in here http://en.cppreference.com/w/cpp/utility/tuple/tuple_element given possible implementation of std::tuple_element.

 template< std::size_t I, class          


        
3条回答
  •  清歌不尽
    2020-12-11 12:50

        template< int ...i> struct seq{};
    
       // GCC couldn't optimize sizeof..(i) , 
       //see http://stackoverflow.com/questions/19783205/why-sizeof-t-so-slow-implement-c14-make-index-sequence-without-sizeof
       //so I use direct variable `s` instead of it.
       // i.e.  s == number of variadic arguments in `I`.
        template< int s, typename I, typename J > struct concate;
    
        template< int s, int ...i, int ...j>
        struct concate, seq >
        { 
            typedef seq type;
        };
    
        template struct make_seq_impl;
        template< int n> using make_seq = typename make_seq_impl::type;
    
        template<> struct make_seq_impl<0>{ typedef seq<> type;};
        template<> struct make_seq_impl<1>{ typedef seq<0> type;};
    
        template struct make_seq_impl: concate< n/2, make_seq, make_seq>{};
    
        template< typename ...T> using seq_for = make_seq< sizeof...(T) > ;
    
    //----------------------------------
    template< int i, typename T> struct id{};
    template< typename T> struct id<0,T>{ typedef T type;};
    template< typename ...T> struct base : T ... {};
    
    template< typename ...T> struct tuple{};
    
    template< std::size_t i, typename Tuple> struct tuple_element;
    
    template< std::size_t i, typename ...T>
    struct tuple_element< i, tuple >
    {
          template< typename Seq > struct apply;
          template< int ...j > struct apply< seq >
          {
             // j xor i ==> ( 0 xor i), (1 xor i), (2 xor i ),...(i xor i) ...
             //    =>  i0, i1, ..., 0 (at pos i) ...
             // and only id<0,T> has `type`.
              typedef base< id< (j xor i), T> ... > base_t;
              typedef typename base_t::type type;
           };
    
         typedef typename apply< seq_for >::type type;
    };
    

提交回复
热议问题