【转】tars源码漫谈第1篇------tc_loki.h (牛逼哄哄的loki库)

loki库是C++模板大牛Andrei写的, 里面大量运用模板的特性, 而tc_loki.h借用了loki库的部分代码, 形成了一个基本的文件tc_loki.h, 来看看:

  1 #ifndef __TC_TYPETRAITS_H
  2 #define __TC_TYPETRAITS_H
  3  
  4 #include <memory>
  5  
  6 namespace tars
  7 {
  8 /////////////////////////////////////////////////
  9 // 说明: loki            
 10 /////////////////////////////////////////////////
 11  
 12 namespace TL
 13 {
 14     //只声明, 不定义的类, 作为TYPELIST的末端类型
 15     class NullType;
 16  
 17     //空类型
 18     struct EmptyType { };
 19  
 20     /**
 21      * 数值到类型的映射
 22      */
 23     template<int v>
 24     struct Int2Type
 25     {
 26        enum { value = v };
 27     };
 28  
 29     /**
 30      * 类型到类型的映射
 31      */
 32     template<typename T>
 33     struct Type2Type
 34     {
 35         typedef T OriginalType;
 36     };
 37  
 38     ///////////////////////////////////////////////////////////////////////////
 39     // 以下是TypeList的定义(目前只支持10个参数)
 40     /**
 41      * 定义类型链表
 42     */
 43     template<typename Head, typename Tail>
 44     struct TypeList
 45     {
 46         typedef Head H;
 47         typedef Tail T;
 48     };
 49  
 50     #define TYPELIST_1(T1) TypeList<T1, TL::NullType>
 51     #define TYPELIST_2(T1, T2) TypeList<T1, TL::TYPELIST_1(T2)>
 52     #define TYPELIST_3(T1, T2, T3) TypeList<T1, TL::TYPELIST_2(T2, T3)>
 53     #define TYPELIST_4(T1, T2, T3, T4) TypeList<T1, TL::TYPELIST_3(T2, T3, T4)>
 54     #define TYPELIST_5(T1, T2, T3, T4, T5) TypeList<T1, TL::TYPELIST_4(T2, T3, T4, T5)>
 55     #define TYPELIST_6(T1, T2, T3, T4, T5, T6) TypeList<T1, TL::TYPELIST_5(T2, T3, T4, T5, T6)>
 56     #define TYPELIST_7(T1, T2, T3, T4, T5, T6, T7) TypeList<T1, TL::TYPELIST_6(T2, T3, T4, T5, T6, T7)>
 57     #define TYPELIST_8(T1, T2, T3, T4, T5, T6, T7, T8) TypeList<T1, TL::TYPELIST_7(T2, T3, T4, T5, T6, T7, T8)>
 58     #define TYPELIST_9(T1, T2, T3, T4, T5, T6, T7, T8, T9) TypeList<T1, TL::TYPELIST_8(T2, T3, T4, T5, T6, T7, T8, T9)>
 59     #define TYPELIST_10(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) TypeList<T1, TL::TYPELIST_9(T2, T3, T4, T5, T6, T7, T8, T9, T10)>
 60     #define TYPELIST_11(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) TypeList<T1, TL::TYPELIST_10(T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)>
 61     #define TYPELIST_12(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) TypeList<T1, TL::TYPELIST_11(T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)>
 62     #define TYPELIST_13(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) TypeList<T1, TL::TYPELIST_12(T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13)>
 63     #define TYPELIST_14(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) TypeList<T1, TL::TYPELIST_13(T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14)>
 64     #define TYPELIST_15(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) TypeList<T1, TL::TYPELIST_14(T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)>
 65     #define TYPELIST_16(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) TypeList<T1, TL::TYPELIST_15(T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16)>
 66     #define TYPELIST_17(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) TypeList<T1, TL::TYPELIST_16(T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17)>
 67     #define TYPELIST_18(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) TypeList<T1, TL::TYPELIST_17(T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18)>
 68     #define TYPELIST_19(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) TypeList<T1, TL::TYPELIST_18(T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19)>
 69     #define TYPELIST_20(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) TypeList<T1, TL::TYPELIST_19(T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20)>
 70  
 71  
 72     //////////////////////////////////////////////////////////////////////////////
 73     // 以下定义TypeList的编译期的操作函数(通过偏特化实现)
 74     /**
 75      * Length: 取TypeList的长度
 76      */
 77     template<class TList> struct Length;
 78     template<> struct Length<NullType>
 79     {
 80         enum { value = 0 };
 81     };
 82     template<class Head, class Tail> struct Length<TypeList<Head, Tail> >
 83     {
 84         enum { value = 1 + Length<Tail>::value };
 85     };
 86  
 87     /**
 88      * TypeAt, 取链表在i位置上的类型
 89      */
 90     template<class TList, unsigned int i> struct TypeAt;
 91     template<class Head, class Tail> struct TypeAt<TypeList<Head, Tail>, 0>
 92     {
 93         typedef Head Result;
 94     };
 95     template<class Head, class Tail, unsigned int i> struct TypeAt<TypeList<Head, Tail>, i>
 96     {
 97         typedef typename TypeAt<Tail, i-1>::Result Result;
 98     };
 99  
100     /**
101      * TypeAt, 取链表在i位置上的类型, i超出了返回, 则返回DefaultType
102      */
103     template<class TList, unsigned int index, typename DefaultType = NullType> struct TypeAtNonStrict
104     {
105         typedef DefaultType Result;
106     };
107     template <class Head, class Tail, typename DefaultType> struct TypeAtNonStrict<TypeList<Head, Tail>, 0, DefaultType>
108     {
109         typedef Head Result;
110     };
111     template <class Head, class Tail, unsigned int i, typename DefaultType> struct TypeAtNonStrict<TypeList<Head, Tail>, i, DefaultType>
112     {
113         typedef typename TypeAtNonStrict<Tail, i - 1, DefaultType>::Result Result;
114     };
115  
116     /**
117      * 取链表上类型为T的序号, 没有则返回-1
118      */
119     template<class TList, class T> struct IndexOf;
120     template<class T> struct IndexOf<NullType, T>
121     {
122         enum { value = -1 };
123     };
124     template<class Tail, class T> struct IndexOf<TypeList<T,Tail>, T>
125     {
126         enum { value = 0 };
127     };
128     template<class Head, class Tail, class T> struct IndexOf<TypeList<Head, Tail>, T>
129     {
130     private:
131         enum { temp = IndexOf<Tail, T>::value };
132     public:
133         enum { value = temp == -1 ? -1 : 1 + temp };
134     };
135  
136     /**
137      * Append, 添加到链表尾部
138      */
139     template<class TList, class T> struct Append;
140     template<> struct Append<NullType, NullType>
141     {
142         typedef NullType Result;
143     };
144     template<class T> struct Append<NullType,T>
145     {
146         typedef TYPELIST_1(T) Result;
147     };
148     template<class Head, class Tail> struct Append<NullType, TypeList<Head, Tail> >
149     {
150         typedef TypeList<Head, Tail> Result;
151     };
152     template<class Head, class Tail, class T> struct Append<TypeList<Head, Tail>, T>
153     {
154         typedef TypeList<Head, typename Append<Tail, T>::Result> Result;
155     };
156  
157     /**
158      * Erase 删除
159      */
160     template<class TList, class T> struct Erase;
161     template<class T> struct Erase<NullType, T>
162     {
163         typedef NullType Result;
164     };
165     template<class T, class Tail> struct Erase<TypeList<T, Tail>, T>
166     {
167         typedef Tail Result;
168     };
169     template<class Head, class Tail, class T> struct Erase<TypeList<Head, Tail>, T>
170     {
171         typedef TypeList<Head, typename Erase<Tail, T>::Result> Result;
172     };
173  
174     /**
175      * EraseAll 删除
176      */
177     template<class TList, class T> struct EraseAll;
178     template<class T> struct EraseAll<NullType, T>
179     {
180         typedef NullType Result;
181     };
182     template<class T, class Tail> struct EraseAll<TypeList<T, Tail>, T>
183     {
184         typedef typename EraseAll<Tail, T>::Result Result;
185     };
186     template<class Head, class Tail, class T> struct EraseAll<TypeList<Head, Tail>, T>
187     {
188         typedef TypeList<Head, typename EraseAll<Tail, T>::Result> Result;
189     };
190  
191     /**
192      * 生成TypeList类型
193      */
194     template<class T1=NullType,  class T2=NullType,  class T3=NullType,  class T4=NullType,  class T5=NullType,
195              class T6=NullType,  class T7=NullType,  class T8=NullType,  class T9=NullType,  class T10=NullType,
196              class T11=NullType, class T12=NullType, class T13=NullType, class T14=NullType, class T15=NullType,
197              class T16=NullType, class T17=NullType, class T18=NullType, class T19=NullType, class T20=NullType>
198     struct TLMaker
199     {
200     private:
201         typedef TYPELIST_20(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
202                             T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) TmpList;
203     public:
204         typedef typename EraseAll<TmpList, NullType>::Result Result;
205     };
206  
207     /////////////////////////////////////////////////////////////////////////////////////
208     //判断类型T是否可以转换成类型U(参考了wbl库, 直接采用loki, 编译时会有警告
209     //关键:如果能够转换, 则接收U的函数, 也能够接收T
210     template<class T, class U>
211     class Conversion
212     {
213     protected:
214         typedef char YES;
215         struct NO {char dummy[2];};
216         struct any_conversion
217         {
218             template <typename P> any_conversion(const volatile P&);
219             template <typename P> any_conversion(P&);
220         };
221  
222         template <typename P> struct conversion_checker
223         {
224             static NO  _m_check(any_conversion ...);
225             static YES _m_check(P, int);
226         };    
227  
228         static T _m_from;
229     public:
230         enum
231         {
232             //是否可以转换(如果Test(makeT())匹配到了static Small Test(U), 则可以转换)
233             exists      = (sizeof(conversion_checker<U>::_m_check(_m_from, 0)) == sizeof(YES)),
234             //是否可以双向转换
235             exists2Way  = exists && Conversion<U, T>::exists,
236             //是否相同类型
237             sameType    = false
238         };
239     };
240  
241     //偏特化来确定sameType
242     template<class T>
243     class Conversion<T, T>
244     {
245     public:
246         enum
247         {
248             exists      = true,
249             exists2Way  = true,
250             sameType    = true
251         };
252     };
253  
254     //判断两个类是否可以继承
255     //关键:子类指针可以转换成父类指针, 且不是void*类型
256     //相同类型, SUPERSUBCLASS判断为true
257     #define SUPERSUBCLASS(T, U) (TL::Conversion<const U*, const T*>::exists && !TL::Conversion<const T*, const void*>::sameType)
258     //相同类型, SUPERSUBCLASS_STRICT判断为false
259     #define SUPERSUBCLASS_STRICT(T, U) (SUPERSUBCLASS(T, U) && !TL::Conversion<const T, const U>::sameType)
260  
261     ///////////////////////////////////////////////////////////////////////////////////////////////
262     // 类型选择器
263     template<bool flag, typename U, typename V>
264     struct TypeSelect
265     {
266         typedef U Result;
267     };
268  
269     template<typename U, typename V>
270     struct TypeSelect<false, U, V>
271     {
272         typedef V Result;
273     };
274  
275     ///////////////////////////////////////////////////////////////////////////////////////
276     /**
277      * 类型萃取器, copy至Loki库
278      */
279     template<typename T>
280     class TypeTraits
281     {
282     private:
283  
284         ///////////////////////////////////////////////////////
285         //提取引用的原始类型(即去掉引用类型)
286         template<class U>
287         struct ReferenceTraits
288         {
289             enum { result = false };
290             typedef U Result;
291         };
292  
293         template<class U>
294         struct ReferenceTraits<U&>
295         {
296             enum { result = true };
297             typedef U Result;
298         };
299  
300         ///////////////////////////////////////////////////////
301         //指针类型
302         template<class U>
303         struct PointerTraits
304         {
305             enum { result = false };
306             typedef TL::NullType Result;
307         };
308  
309         template<class U>
310         struct PointerTraits<U*>
311         {
312             enum { result = true };
313             typedef U Result;
314         };
315  
316         template<class U>
317         struct PointerTraits<U*&>
318         {
319             enum { result = true };
320             typedef U Result;
321         };
322  
323         ///////////////////////////////////////////////////////
324         //成员函数指针, gcc下面支持有问题, 屏蔽之
325         template<typename U>
326         struct PointerToMemberTraits
327         {
328             enum { result = false };
329         };
330  
331         template<class U, class V>
332         struct PointerToMemberTraits<U V::*>
333         {
334             enum { result = true };
335         };
336  
337         template<class U, class V>
338         struct PointerToMemberTraits<U V::*&>
339         {
340             enum { result = true };
341         };
342  
343         ///////////////////////////////////////////////////////
344         // const
345         template<typename U>
346         struct UnConstTraits
347         {
348             enum { result = false };
349             typedef U Result;
350         };
351         template<typename U>
352         struct UnConstTraits<const U>
353         {
354             enum { result = true };
355             typedef U Result;
356         };
357         template<typename U>
358         struct UnConstTraits<const U&>
359         {
360             enum { result = true };
361             typedef U& Result;
362         };
363  
364         ///////////////////////////////////////////////////////
365         // volatile
366         template<typename U>
367         struct UnVolatileTraits
368         {
369             enum { result = false };
370             typedef U Result;
371         };
372         template<typename U>
373         struct UnVolatileTraits<volatile U>
374         {
375             enum { result = true };
376             typedef U Result;
377         };
378         template<typename U>
379         struct UnVolatileTraits<volatile U&>
380         {
381             enum { result = true };
382             typedef U& Result;
383         };
384     public:
385         //T是否是指针类型
386         enum { isPointer        = PointerTraits<T>::result };
387         //T是否是引用类型
388         enum { isReference         = ReferenceTraits<T>::result };
389         //T是否指向成员函数的指针
390         enum { isMemberPointer     = PointerToMemberTraits<T>::result };
391  
392         //T是否是Const类型
393         enum { isConst          = UnConstTraits<T>::result };
394         //T是否是Volatile类型
395         enum { isVolatile       = UnVolatileTraits<T>::result };
396  
397         //如果T是指针类型,则获取T的原类型, 即去掉指针类型
398         typedef typename PointerTraits<T>::Result             PointeeType;
399         //如果T是引用类型,则获取T的原类型, 即去掉引用类型
400         typedef typename ReferenceTraits<T>::Result         ReferencedType;
401         //如果T是Const类型,则获取T的原类型, 即去掉Const类型
402         typedef typename UnConstTraits<T>::Result           NonConstType;
403         //如果T是volatile类型,则获取T的原类型, 即去掉volatile类型
404         typedef typename UnVolatileTraits<T>::Result        NonVolatileType;
405         //去掉const volatile类型
406         typedef typename UnVolatileTraits<typename UnConstTraits<T>::Result>::Result UnqualifiedType;
407  
408     public:
409  
410         //////////////////////////////////////////////////////
411         //
412         typedef TL::TLMaker<unsigned char, unsigned short, unsigned int, unsigned long, unsigned long long>::Result UnsignedInts;
413         typedef TL::TLMaker<signed char, short, int, long, long long>::Result SignedInts;
414         typedef TL::TLMaker<bool, char, wchar_t>::Result OtherInts;
415         typedef TL::TLMaker<float, double, long double>::Result Floats;
416         typedef TL::TYPELIST_2(TL::EmptyType, TL::NullType) NullTypes;
417  
418         //无符号整形
419         enum { isStdUnsignedInt = TL::IndexOf<UnsignedInts, T>::value >= 0 };
420         //有符号整形
421         enum { isStdSignedInt     = TL::IndexOf<SignedInts, T>::value >= 0 };
422         //整形
423         enum { isStdInt         = isStdUnsignedInt || isStdSignedInt || TL::IndexOf<OtherInts, T>::value >= 0 };
424         //浮点类型
425         enum { isStdFloat         = TL::IndexOf<Floats, T>::value >= 0 };
426         //数值类型
427         enum { isStdArith         = isStdInt || isStdFloat };
428         //基础类型(包括void)
429         enum { isStdFundamental    = isStdArith || TL::IndexOf<TL::TYPELIST_1(void), T>::value >= 0};
430         //空类型
431         enum { isNullType       = TL::IndexOf<NullTypes, T>::value >= 0 };
432         //简单类型
433         enum { isBaseType       = isStdArith || isPointer || isMemberPointer };
434  
435         //对于复杂类型, 获取数据的引用类型, 即加上引用类型
436         typedef typename TypeSelect<isBaseType, T, ReferencedType&>::Result ReferenceType;
437  
438         //对于复杂类型且非空类型, 获取数据的引用类型, 即加上引用类型
439         //typedef typename TypeSelect<isBaseType || isNullType, T, ReferencedType&>::Result ReferenceTypeEx;
440  
441         //获取数据的原类型, 消除引用的引用这种情况
442         typedef typename TypeSelect<!isReference, T, ReferencedType&>::Result ParameterType;
443     };
444  
445     ////////////////////////////////////////////////////////////////////////////////////////////////////
446     //下面的使用开始展示TypeList的威力, 用于自动生成class
447  
448     //散乱的继承体系
449     template<class TList, template <class> class Unit>
450     class ScatterHierarchy;
451  
452     /*
453     namespace p
454     {
455         //注释copy至loki库
456         // The following type helps to overcome subtle flaw in the original
457         // implementation of GenScatterHierarchy.
458         // The flaw is revealed when the input type list of GenScatterHierarchy
459         // contains more then tars element of the same type (e.g. LOKI_TYPELIST_2(int, int)).
460         // In this case GenScatterHierarchy will contain multiple bases of the same
461         // type and some of them will not be reachable (per 10.3).
462         // For example before the fix the first element of Tuple<LOKI_TYPELIST_2(int, int)>
463         // is not reachable in any way!
464         template<class, class>
465         struct ScatterHierarchyTag;
466     }
467     template<class T1, class T2, template <class> class Unit>
468     class ScatterHierarchy<TypeList<T1, T2>, Unit> : public ScatterHierarchy<p::ScatterHierarchyTag<T1, T2>, Unit>
469                                                    , public ScatterHierarchy<T2, Unit>
470     {
471     public:
472         typedef TypeList<T1, T2> TList;
473         typedef ScatterHierarchy<p::ScatterHierarchyTag<T1, T2>, Unit> LeftBase;
474         typedef ScatterHierarchy<T2, Unit> RightBase;
475         template<typename T> struct Rebind
476         {
477             typedef Unit<T> Result;
478         };
479     };
480     // In the middle *unique* class that resolve possible ambiguity
481     template <class T1, class T2, template <class> class Unit>
482     class ScatterHierarchy<p::ScatterHierarchyTag<T1, T2>, Unit>
483         : public ScatterHierarchy<T1, Unit>
484     {
485     };
486     */
487  
488     //具现化继承体系
489     template <class T1, class T2, template <class> class Unit>
490     class ScatterHierarchy<TypeList<T1, T2>, Unit>
491         : public ScatterHierarchy<T1, Unit>
492         , public ScatterHierarchy<T2, Unit>
493     {
494     public:
495         typedef TypeList<T1, T2> TList;
496         typedef ScatterHierarchy<T1, Unit> LeftBase;
497         typedef ScatterHierarchy<T2, Unit> RightBase;
498         template <typename T> struct Rebind
499         {
500             typedef Unit<T> Result;
501         };
502     };
503  
504     template<class AtomicType, template <class> class Unit>
505     class ScatterHierarchy : public Unit<AtomicType>
506     {
507     public:
508         typedef Unit<AtomicType> LeftBase;
509  
510         template<typename T> struct Rebind
511         {
512             typedef Unit<T> Result;
513         };
514     };
515  
516     template<template <class> class Unit>
517     class ScatterHierarchy<NullType, Unit>
518     {
519     public:
520         template<typename T> struct Rebind
521         {
522             typedef Unit<T> Result;
523         };
524     };
525  
526     /////////////////////////////////////////////////////////////////////
527     //构建继承体系后, 采用下面的函数获取继承体系中某个类
528  
529     template<class T, class H>
530     struct FieldHelperByType
531     {
532         typedef typename H::template Rebind<T>::Result ResultType;
533         static ResultType& dochange(H &obj)
534         {
535             return static_cast<ResultType&>(obj);
536         }
537     };
538     template<class T, class H>
539     struct FieldHelperByType<T, const H>
540     {
541         typedef const typename H::template Rebind<T>::Result ResultType;
542         static ResultType& dochange(const H &obj)
543         {
544             return (ResultType&)obj;
545         }
546     };
547  
548     //直接按照类型获取, 如果有两个相同的类型, 则编译不过
549     template<class T, class H>
550     typename FieldHelperByType<T, H>::ResultType& field(H &obj)
551     {
552         return FieldHelperByType<T, H>::dochange(obj);
553     }
554  
555     /////////////////////////////////////////////////////////////////////
556     // 根据索引获取字段
557     //定义Tuple, 默认的数据操作器(Unit)
558     template<typename T>
559     struct TupleUnit
560     {
561         T _value;
562         operator T&()               { return _value; }
563         operator const T&() const   { return _value; }
564     };
565  
566     template<class TList>
567     struct Tuple : public ScatterHierarchy<TList, TupleUnit>
568     {
569     };
570  
571     //定义FieldHelperByIndex
572     template<class H, unsigned int i> struct FieldHelperByIndex;
573  
574     //特化版本的FieldHelperByIndex, 推导出最后一个元素
575     template<class H>
576     struct FieldHelperByIndex<H, 0>
577     {
578         typedef typename H::TList::H ElementType;
579         typedef typename H::template Rebind<ElementType>::Result UnitType;
580  
581         enum
582         {
583             isTuple = Conversion<UnitType, TupleUnit<ElementType> >::sameType,
584             isConst = TypeTraits<H>::isConst
585         };
586  
587         typedef const typename H::LeftBase ConstLeftBase;
588         typedef typename TypeSelect<isConst, ConstLeftBase, typename H::LeftBase>::Result LeftBase;
589         typedef typename TypeSelect<isTuple, ElementType, UnitType>::Result UnqualifiedResultType;
590         typedef typename TypeSelect<isConst, const UnqualifiedResultType, UnqualifiedResultType>::Result ResultType;
591  
592         static ResultType &dochange(H& obj)
593         {
594             LeftBase &leftBase = obj;
595             return (ResultType&)leftBase;
596         }
597     };
598  
599     //根据索引获取FieldHelper
600     template<class H, unsigned int i>
601     struct FieldHelperByIndex
602     {
603         typedef typename TypeAt<typename H::TList, i>::Result ElementType;
604         typedef typename H::template Rebind<ElementType>::Result UnitType;
605  
606         enum
607         {
608             isTuple = Conversion<UnitType, TupleUnit<ElementType> >::sameType,
609             isConst = TypeTraits<H>::isConst
610         };
611  
612         typedef const typename H::RightBase ConstRightBase;
613         typedef typename TypeSelect<isConst, ConstRightBase, typename H::RightBase>::Result RightBase;
614         typedef typename TypeSelect<isTuple, ElementType, UnitType>::Result UnqualifiedResultType;
615         typedef typename TypeSelect<isConst, const UnqualifiedResultType, UnqualifiedResultType>::Result ResultType;
616  
617         static ResultType &dochange(H& obj)
618         {
619             RightBase &rightBase = obj;
620             return FieldHelperByIndex<RightBase, i-1>::dochange(rightBase);
621         }
622     };
623  
624     //定义按照索引获取
625     template<unsigned int i, class H>
626     typename FieldHelperByIndex<H, i>::ResultType &field(H& obj)
627     {
628         return FieldHelperByIndex<H, i>::dochange(obj);
629     }
630 }
631  
632 }
633 #endif
634  

       是不是有一种看天书的感觉, 确实如此。

       也行, 姑且把它当成和STL类似的基础库, 别纠结于它。

转自:https://blog.csdn.net/stpeace/article/details/79772562

猜你喜欢

转载自www.cnblogs.com/Ivan10000/p/9854801.html