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

转载于:https://www.cnblogs.com/Ivan10000/p/9854801.html

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

  1. tars源码漫谈第24篇------tc_lock.h(基本锁)

    这个文件很简单, 来看下: /*** Tencent is pleased to support the open source community by making Tars available. ...

  2. 【含源码】这套Spring Cloud项目牛逼了

    分享的项目包含2个,一套是SpringCloud的电商系统,一个是基于SpringBoot博客系统. SpringCloud的电商系统 Spring Cloud ES Redis FastDFS Ka ...

  3. hadoop作业初始化过程详解(源码分析第三篇)

    (一)概述 我们在上一篇blog已经详细的分析了一个作业从用户输入提交命令到到达JobTracker之前的各个过程.在作业到达JobTracker之后初始化之前,JobTracker会通过submit ...

  4. 详解linux下auto工具制作Makefile源码包(制作篇)

    2019独角兽企业重金招聘Python工程师标准>>> 详解linux下auto工具制作Makefile源码包(制作篇) 水木杨 一.     概述 为了更好的制作configure ...

  5. Android源码解析(一)动画篇-- Animator属性动画系统

    Android源码解析-动画篇 Android源码解析(一)动画篇-- Animator属性动画系统 Android源码解析(二)动画篇-- ObjectAnimator Android在3.0版本中 ...

  6. Markdown编辑器:纯前端演示(可接入项目、含源码下载) - 总结篇

    可接入项目,提供全部代码下载. 通过本地html静态文件,演示效果. Editor.md是一款开源的.可嵌入的 Markdown 在线编辑器(组件),基于 CodeMirror.jQuery 和 Ma ...

  7. Soul网关源码阅读番外篇(一) HTTP参数请求错误

    Soul网关源码阅读番外篇(一) HTTP参数请求错误 共同作者:石立 萧 * 简介     在Soul网关2.2.1版本源码阅读中,遇到了HTTP请求加上参数返回404的错误,此篇文章基于此进行探索 ...

  8. Kubernetes Node Controller源码分析之配置篇

    2019独角兽企业重金招聘Python工程师标准>>> Author: xidianwangtao@gmail.com Kubernetes Node Controller源码分析之 ...

  9. UWA学堂上新|虚幻引擎源码解析——基础容器篇

    文章简介 文章主要介绍了虚幻引擎的基础容器的内部数据结构和实现原理,以及在实践中的应用,性能优化等方面.包括:TArray.TSparseArray.TSet.TMap等基础容器,TQueue.TTr ...

最新文章

  1. java 反射 注解 运用_Java注解与反射的使用
  2. Android -----ArrayAdapter的重写 .
  3. java面向对象编程知识点总结
  4. 声明对象 创建对象_流利的对象创建
  5. java 1.6.0.11_ubuntu 11.10安装java1.6(转)
  6. linux文本编辑器下载,Linux文本编辑器Jed
  7. 【LaTeX】pdfTex error: pdflatex.exe (file simhei.ttf): cannot open TrueType font file for reading解决方案
  8. SpringBoot:使用Caffeine实现缓存
  9. aide, libgdx写一个爱心小游戏
  10. 史上最全CAD快捷键大全汇总
  11. python单词查询_Python实现单词查询文件查找
  12. 可以说是迄今为止最好用的右键菜单管理工具
  13. 一个C++程序员的个人网站搭建
  14. iOS使用颜色生成图片的暗黑适配
  15. VB/VBA,请让我点名表扬你
  16. Docker入门的亿点点学习
  17. 工业大数据漫谈3:什么是工业大数据?
  18. android录音波浪动画_Android实现炫酷的波浪下载Loading动画
  19. icq蓝牙_使用WhizBase发送ICQ消息
  20. 【STM32】STM32之DRV8834电机驱动(IO方式)

热门文章

  1. 微软2017年预科生计划在线编程笔试
  2. 服务器定时任务vbs文件,自动以管理员身份运行批处理bat文件(vbs与bat两种方法)...
  3. 洛谷P1640 连续攻击游戏 二分图匹配
  4. html语义化有利于seo,HTML语义化和SEO优化
  5. js获取7天前,n天前的日期,7天后,n天后的日期,获取当前日期是周几
  6. 牛客-计算机复试题-求图的连通分支数
  7. 储能是什么?​储能系统解决方案现状及趋势​
  8. 对象序列化,反序列化
  9. 如何在Apache和Nginx开启 OCSP Stapling
  10. 看完之后你还不了解SpringCloud,就取关吧