£vDTLinuxÁªÃË vDTLinuxÁªÃË ÎÒÃÇÖªµÀ¶ÔÓÚÏÂÃæµÄÄ£°åÀࣺvDTLinuxÁªÃË vDTLinuxÁªÃË #endifvDTLinuxÁªÃË #ifdef CODE_NOTEvDTLinuxÁªÃË template vDTLinuxÁªÃË struct StructvDTLinuxÁªÃË {vDTLinuxÁªÃË };vDTLinuxÁªÃË Struct<0> a;vDTLinuxÁªÃË Struct<1> b;vDTLinuxÁªÃË Struct<2> c;vDTLinuxÁªÃË Struct<3> d;vDTLinuxÁªÃË //... ...vDTLinuxÁªÃË #endif//CODE_NOTEvDTLinuxÁªÃË #if 0vDTLinuxÁªÃË vDTLinuxÁªÃË ÉÏÃæµÄStructÄ£°åµÄÄ£°å²ÎÊý²»Í¬½«»áÉú³É²»Í¬µÄÀàÐÍ¡£ÀýÈ磺ÉÏÃæµÄStruct<0>¡¢vDTLinuxÁªÃË Struct<1>¡¢Struct<2>ºÍStruct<3>ÊÇËÄÖÖ²»Í¬µÄÀàÐÍ¡£ÕâÒ»µã¾ÍÏñÊǸøÕâ¸öÄ£°å±àºÅÈÃÕâvDTLinuxÁªÃË ¸ö±àºÅµÄ²»Í¬À´Çø·Ö³ö²»Í¬µÄÀàÐÍ¡£ÕýÊÇÒòΪÕâÖÖÏÖÏóµÄ´æÔÚÎÒÃDzÅÓÐÁËÕâÑùµÄ˼Ï룺ÔÚvDTLinuxÁªÃË ÐµÄscatter´úÂëÉú³É»úÖÆÖиøÃ¿Ò»¸ö´®ÖеÄÀàÐÍÉùÃ÷±äÁ¿µÄʱºò¶îÍâÌí¼ÓÒ»¸öÀàÐÍË÷ÒýºÅvDTLinuxÁªÃË ¡£ÕâÑù¾Í¿ÉÒÔʹÓþ²Ì¬×ªÐÍ·½·¨·Ö±æ³öͬÀàÐ͵ıäÁ¿ÁË¡£¼û´úÂëCODE1Ëùʾ£ºvDTLinuxÁªÃË vDTLinuxÁªÃË #endifvDTLinuxÁªÃË #ifdef CODE1vDTLinuxÁªÃË #include vDTLinuxÁªÃË #include "meta.h"//ΪÁËÒýÈëpandaxcl::consvDTLinuxÁªÃË //ÏÂÃæµÄ´úÂë½ö½öÊÇΪÁ˲âÊÔ²úÉú´úÂëµÄË÷ÒýºÅºÍÀàÐÍÊÇ·ñÆ¥Åä¶øÒýÈëµÄÌØÐÔÀàÄ£°åvDTLinuxÁªÃË //˵µÃ¼òµ¥µã£¬ÕâÀïËùνµÄÌØÐÔÀà¾ÍÊÇÒ»ÖÖ´óÐ͵Äswitch£¬case½á¹¹£¬Ö»²»¹ýÊǸú¾ÝvDTLinuxÁªÃË //ÀàÐ͵IJ»Í¬ÓɱàÒëÆ÷À´×Ô¶¯Ñ¡ÔñÏàÓ¦µÄÄ£°å¡£ÔÚÕâÀïÌÖÂÛµÄÌØÐÔÀàʵ¼ÊÉÏ¿ÉÒÔÓ¦ÓÃvDTLinuxÁªÃË //µ½³·ÏúºÍÖØ×ö¿ò¼ÜµÄÐòÁл¯·½°¸ÖÐÈ¥£¬µ±È»ÕâÊÇΪÁ˱£´æÀàÐÍÃû³ÆÁË¡£vDTLinuxÁªÃË template struct traits;vDTLinuxÁªÃË template <> struct traits{static const char*name(){return "char";}};vDTLinuxÁªÃË template <> struct traits{static const char*name(){return "int ";}};vDTLinuxÁªÃË ////////////////////////////////////////////////////////////vDTLinuxÁªÃË //ÏÂÃæµÄÕâ¸ö²úÉú´úÂëµÄ¸ñʽ»¹¿ÉÒÔʹÓÃË÷ÒýºÅµÃµ½»ùÔª¶ÔÏó×¢ÒâÁË£ºÏÂÃæµÄµÝ¹éÄ£°åµÄvDTLinuxÁªÃË //ÖÕ½áÌõ¼þ²¢²»ÊǵÚÒ»¸öÄ£°å²ÎÊýsize_t¶øÊǵڶþ¸öÄ£°å²ÎÊýT£¬ÕâÒ»µãºÜÖØÒª£¬ÒòÎªÇ°ÃævDTLinuxÁªÃË //µÄÎÄÕÂÖÐÌÖÂ۵ͼÊÇÒÔÊý×Ö0×÷ΪÖÕ½áÌõ¼þµÄ¡£ËùÒÔÕâÀïÐèÒªÌØ±ð˵Ã÷һϣ¬ÁíÍâÒ²¿ÉÒÔvDTLinuxÁªÃË //¸øÄãÒ»µãÁé¸Ð:)vDTLinuxÁªÃË templateclass Unit>vDTLinuxÁªÃË struct scatter_helper : public UnitvDTLinuxÁªÃË {vDTLinuxÁªÃË //ÏÂÃæµÄ¹¹Ô캯Êý½ö½öÊÇΪÁËÊä³öË÷ÒýºÅ¶ÔÓ¦µÄÀàÐÍÐÅÏ¢¶øÒýÈëµÄvDTLinuxÁªÃË scatter_helper()vDTLinuxÁªÃË {vDTLinuxÁªÃË std::cout << traits::name() << " : " << i << std::endl;vDTLinuxÁªÃË }vDTLinuxÁªÃË };vDTLinuxÁªÃË templateclass Unit>vDTLinuxÁªÃË struct scatter_helper<:cons,Unit>vDTLinuxÁªÃË : public scatter_helpervDTLinuxÁªÃË , public scatter_helper//µÝÔöµÄΪÿһ¸öÀàÐÍÌí¼ÓÒ»¸ö¶îÍâµÄË÷ÒýºÅvDTLinuxÁªÃË {vDTLinuxÁªÃË typedef pandaxcl::cons cons_type;vDTLinuxÁªÃË };vDTLinuxÁªÃË //ÏÂÃæµÄnull_type²Î¿´Ç°Ò»ÕÂÖеĴúÂëvDTLinuxÁªÃË templateclass Unit>vDTLinuxÁªÃË struct scatter_helper<:null_type,unit>vDTLinuxÁªÃË {vDTLinuxÁªÃË };vDTLinuxÁªÃË //ΪÁ˺ÍÇ°ÃæÕ½ÚÖÐÌÖÂÛµÄscatter¼æÈÝÒ²ÊÇΪÁË·½±ãʹÓ㬠<:cons<:null_type,unit>ÕâÀïÖØÐ¶Ôscatter_helper½øÐÐvDTLinuxÁªÃË //°ü×°Éú³ÉÁËÒ»¸öÄ£°åÀàscatter£¬ÕâÑùÇ°ÃæÊ¹ÓõÄÈκη½·¨Õë¶Ô <:cons<:null_type,unit>ÓÚÕâ¸öеÄscatterÀàͬÑùvDTLinuxÁªÃË //ÊÊÓá£vDTLinuxÁªÃË template class Unit>vDTLinuxÁªÃË struct scatter:public scatter_helper<0,Cons,Unit>vDTLinuxÁªÃË {vDTLinuxÁªÃË typedef Cons cons_type;vDTLinuxÁªÃË };vDTLinuxÁªÃË //ÏÂÃæµÄº¯ÊýÓÃÀ´¸ù¾ÝÀàÐÍË÷ÒýºÅÀ´µÃµ½ÏàÓ¦µÄ»ùÔªÀàÐÍvDTLinuxÁªÃË template class Unit>vDTLinuxÁªÃË scatter_helper::result,Unit>&vDTLinuxÁªÃË field(scatter&obj)vDTLinuxÁªÃË {vDTLinuxÁªÃË typedef typename pandaxcl::type::result CT;vDTLinuxÁªÃË typedef scatter_helper RT;vDTLinuxÁªÃË return static_cast(obj);vDTLinuxÁªÃË };vDTLinuxÁªÃË template class Unit>vDTLinuxÁªÃË const scatter_helper::result,Unit>&vDTLinuxÁªÃË field(const scatter&obj)vDTLinuxÁªÃË {vDTLinuxÁªÃË typedef typename pandaxcl::type::result CT;vDTLinuxÁªÃË typedef scatter_helper RT;vDTLinuxÁªÃË return static_cast(obj);vDTLinuxÁªÃË };vDTLinuxÁªÃË //////////////////////////////////////////////////vDTLinuxÁªÃË //ÏÂÃæÊDzâÊÔ´úÂëvDTLinuxÁªÃË namespace xcl=pandaxcl;vDTLinuxÁªÃË template struct TestUnitvDTLinuxÁªÃË {vDTLinuxÁªÃË T _value;vDTLinuxÁªÃË };vDTLinuxÁªÃË int main()vDTLinuxÁªÃË {vDTLinuxÁªÃË typedef xcl::consvDTLinuxÁªÃË xcl::consvDTLinuxÁªÃË <:cons<:null_type,unit> xcl::consvDTLinuxÁªÃË xcl::consvDTLinuxÁªÃË <:cons<:null_type,unit> xcl::null_type> > > >CONS;vDTLinuxÁªÃË std::cout << "========scatter_helper========" <<:endl; <:cons<:null_type,unit><:endl; {vDTLinuxÁªÃË scatter_helper<0,CONS,TestUnit> v;vDTLinuxÁªÃË static_cast&>(v)._value = 10;vDTLinuxÁªÃË static_cast&>(v)._value = 'B';vDTLinuxÁªÃË static_cast&>(v)._value = 'C';vDTLinuxÁªÃË static_cast&>(v)._value = 11;vDTLinuxÁªÃË std::cout << static_cast&>(v)._value << " ";vDTLinuxÁªÃË std::cout << static_cast&>(v)._value << " ";vDTLinuxÁªÃË std::cout << static_cast&>(v)._value << " ";vDTLinuxÁªÃË std::cout << static_cast&>(v)._value << " ";vDTLinuxÁªÃË }vDTLinuxÁªÃË std::cout << std::endl << "========field(scatter&)=======" <:cons<:null_type,unit><:endl; <<:endl; ///////////////////////////////////////////////////////vDTLinuxÁªÃË {vDTLinuxÁªÃË scatter v;vDTLinuxÁªÃË field<0>(v)._value = 20;vDTLinuxÁªÃË field<1>(v)._value = 'F';vDTLinuxÁªÃË field<2>(v)._value = 'G';vDTLinuxÁªÃË field<3>(v)._value = 21;vDTLinuxÁªÃË std::cout << field<0>(v)._value << " ";vDTLinuxÁªÃË std::cout << field<1>(v)._value << " ";vDTLinuxÁªÃË std::cout << field<2>(v)._value << " ";vDTLinuxÁªÃË std::cout << field<3>(v)._value << " ";vDTLinuxÁªÃË }vDTLinuxÁªÃË std::cout << std::endl << "===== <:cons<:null_type,unit><:endl; <:endl; field(const scatter&)====" <<:endl; {vDTLinuxÁªÃË scatter v;vDTLinuxÁªÃË field<0>(v)._value = 30;vDTLinuxÁªÃË field<1>(v)._value = 'J';vDTLinuxÁªÃË field<2>(v)._value = 'K';vDTLinuxÁªÃË field<3>(v)._value = 31;vDTLinuxÁªÃË //²âÊÔ³£Á¿Çé¿öϵÄfield¸¨Öúº¯ÊývDTLinuxÁªÃË const scatter&cv = v;vDTLinuxÁªÃË std::cout << field<0>(cv)._value << " ";vDTLinuxÁªÃË std::cout << field<1>(cv)._value << " ";vDTLinuxÁªÃË std::cout << field<2>(cv)._value << " ";vDTLinuxÁªÃË std::cout << field<3>(cv)._value << " ";vDTLinuxÁªÃË }vDTLinuxÁªÃË std::cout << std::endl <:cons<:null_type,unit><:endl; <:endl; <:endl; << "==============================" <<:endl; return 0;vDTLinuxÁªÃË }vDTLinuxÁªÃË #endif//CODE1vDTLinuxÁªÃË ////////////////////////////////////////////vDTLinuxÁªÃË //¸Ã³ÌÐòÔËÐнá¹ûÈçÏ£ºvDTLinuxÁªÃË /**********************************************vDTLinuxÁªÃË ========scatter_helper========vDTLinuxÁªÃË int : 0vDTLinuxÁªÃË char : 1vDTLinuxÁªÃË char : 2vDTLinuxÁªÃË int : 3vDTLinuxÁªÃË 10 B C 11 vDTLinuxÁªÃË ========field(scatter&)=======vDTLinuxÁªÃË int : 0vDTLinuxÁªÃË char : 1vDTLinuxÁªÃË char : 2vDTLinuxÁªÃË int : 3vDTLinuxÁªÃË 20 F G 21 vDTLinuxÁªÃË =====field(const scatter&)====vDTLinuxÁªÃË int : 0vDTLinuxÁªÃË char : 1vDTLinuxÁªÃË char : 2vDTLinuxÁªÃË int : 3vDTLinuxÁªÃË 30 J K 31 vDTLinuxÁªÃË ==============================vDTLinuxÁªÃË *************************************************************/vDTLinuxÁªÃË //////////////////////////////////////////////////////////////////vDTLinuxÁªÃË #if 0vDTLinuxÁªÃË vDTLinuxÁªÃË ´ÓÔËÐнá¹û¿ÉÒÔ¿´³öÎÒÃÇÒѾ³É¹¦µÄ½â¾öÁ˱¾ÎÄ¿ªÍ·ËùÌá³öµÄÎÊÌâ¡£Õâ¸öеĴúÂë²úÉúvDTLinuxÁªÃË Ä£°åÒѾд³öÀ´ÁË¡£ÎªÁËÒÔºóʹÓõķ½±ãÐèÒª½«Õâ¸öÄ£°åÀà¼ÓÈëµ½meta.hÖС£²»¹ý±¾ÎÄÖÐʹvDTLinuxÁªÃË ÓõÄmeta.h²¢Ã»Óаüº¬ÕâÀïµÄscatterÄ£°åÀ࣬¼û¸½Â¼Ëùʾ¡£vDTLinuxÁªÃË vDTLinuxÁªÃË ±¾ÕÂÍê¡£vDTLinuxÁªÃË vDTLinuxÁªÃË Êµ¼ÊÉÏC++Ä£°åÔª±à³ÌµÄ»ù´¡ÓëÓ¦ÓÃÖеĻù´¡ÆªÒѾдÍêÁË£¬´ÓÏÂÒ»Õ¿ªÊ¼½«»áÌÖÂÛÕâÖÖvDTLinuxÁªÃË ±à³Ì¼¼ÊõµÄһЩӦÓÃרÌâ¡£ÏÂÒ»ÕÂÀïÃæ½«»áÉæ¼°µ½µÄרÌâÊÇÀàÐÍÌØÐÔtrait¡££¨¾´Çë¹Ø×¢!£©vDTLinuxÁªÃË vDTLinuxÁªÃË Î´Í꣬´ýÐø...vDTLinuxÁªÃË vDTLinuxÁªÃË #endifvDTLinuxÁªÃË #ifdef CODE_NOTE//¸½Â¼£º±¾ÎIJÉÓõÄmeta.hÎļþÄÚÈÝÈçÏ£ºvDTLinuxÁªÃË #pragma oncevDTLinuxÁªÃË namespace pandaxcl{vDTLinuxÁªÃË ///////////////////////////////////////////////////vDTLinuxÁªÃË template vDTLinuxÁªÃË struct IFvDTLinuxÁªÃË {vDTLinuxÁªÃË typedef Then result;//½«ThenÀàÐÍ×÷ΪÌõ¼þÎªÕæµÄ·µ»ØÖµ <:cons<:null_type,unit><:endl; <:endl; <:endl; <:endl; £¨·µ»ØÖµÎªÀàÐÍ£©vDTLinuxÁªÃË };vDTLinuxÁªÃË templatevDTLinuxÁªÃË struct IFvDTLinuxÁªÃË {vDTLinuxÁªÃË typedef Else result;//½«ElseÀàÐÍ×÷ΪÌõ¼þΪ¼ÙµÄ·µ»ØÖµ£¨·µ»ØÖµÎªÀàÐÍ£©vDTLinuxÁªÃË };vDTLinuxÁªÃË ////////////////////////////////////////////////////////////vDTLinuxÁªÃË /////////////////////////////////////////////////////////vDTLinuxÁªÃË ////¼ÓÈëÒ»¸öÍ⸲²ãÀ´´«µÝ¶îÍâµÄÄ£°å²ÎÊývDTLinuxÁªÃË template class Function,size_t start,size_t finish,size_t step>vDTLinuxÁªÃË struct LOOPvDTLinuxÁªÃË {vDTLinuxÁªÃË //ΪÁËÄܹ»ÕýÈ·µÄ¼ÆËã³öʵ¼ÊµÄÑ»·ÖÕÖ¹±äÁ¿£¬ÐèÒª¶Ô¸ø¶¨µÄÖÕÖ¹±äÁ¿vDTLinuxÁªÃË //½øÐмÆËã£
|