• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            飯中淹的避難所~~~~~

            偶爾來避難的地方~

              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              94 隨筆 :: 0 文章 :: 257 評論 :: 0 Trackbacks

            在使用C++編程的過程中, 有時候,我們可能會遇到需要構(gòu)造很多重復(fù)性的參數(shù)的地方
            比如
            int p1, int p2, int p3, int p4

            這樣的參數(shù)序列, 為了方便和簡化這種重復(fù)性勞動,我在工作中使用了下面這些構(gòu)造參數(shù)表的宏
            現(xiàn)在共享出來希望對大家有所幫助

            //   DP = DEFINE PARAM 定義參數(shù)
            //   STMP = SINGLE TYPE MULTI PARAM 單類型多參數(shù)
            //   下面的是創(chuàng)建 int p1, int p2, int p3這樣形式的參數(shù)定義的.
            //   比如
            //   DP_STMP_3(int, p ); 就相當于
            //   int p1, int p2, int p3

            #define DP_STMP_0(type,pname)
            #define DP_STMP_1(type,pname) type pname##1
            #define DP_STMP_2(type,pname) DP_STMP_1(type,pname), type pname##2
            #define DP_STMP_3(type,pname) DP_STMP_2(type,pname), type pname##3
            #define DP_STMP_4(type,pname) DP_STMP_3(type,pname), type pname##4
            #define DP_STMP_5(type,pname) DP_STMP_4(type,pname), type pname##5
            #define DP_STMP_6(type,pname) DP_STMP_5(type,pname), type pname##6
            #define DP_STMP_7(type,pname) DP_STMP_6(type,pname), type pname##7
            #define DP_STMP_8(type,pname) DP_STMP_7(type,pname), type pname##8
            #define DP_STMP_9(type,pname) DP_STMP_8(type,pname), type pname##9
            #define DP_STMP_10(type,pname) DP_STMP_9(type,pname), type pname##10

            //   DP = DEFINE PARAM 定義參數(shù)
            //   DTMP = DOUBLE TYPE MULTI PARAM 兩類型多參數(shù)
            //   范例
            //   DP_DTMP_3(int, p, float, f ); 就相當于
            //   int p1, float f1, int p2, float f2, int p3, float f3

            #define DP_DTMP_0(type1, pname1, type2, pname2)
            #define DP_DTMP_1(type1, pname1, type2, pname2) type1 pname1##1, type2 pname2##1
            #define DP_DTMP_2(type1, pname1, type2, pname2) DP_DTMP_1(type1,pname1,type2,pname2), type1 pname1##2, type2 pname2##2
            #define DP_DTMP_3(type1, pname1, type2, pname2) DP_DTMP_2(type1,pname1,type2,pname2), type1 pname1##3, type2 pname2##3
            #define DP_DTMP_4(type1, pname1, type2, pname2) DP_DTMP_3(type1,pname1,type2,pname2), type1 pname1##4, type2 pname2##4
            #define DP_DTMP_5(type1, pname1, type2, pname2) DP_DTMP_4(type1,pname1,type2,pname2), type1 pname1##5, type2 pname2##5
            #define DP_DTMP_6(type1, pname1, type2, pname2) DP_DTMP_5(type1,pname1,type2,pname2), type1 pname1##6, type2 pname2##6
            #define DP_DTMP_7(type1, pname1, type2, pname2) DP_DTMP_6(type1,pname1,type2,pname2), type1 pname1##7, type2 pname2##7
            #define DP_DTMP_8(type1, pname1, type2, pname2) DP_DTMP_7(type1,pname1,type2,pname2), type1 pname1##8, type2 pname2##8
            #define DP_DTMP_9(type1, pname1, type2, pname2) DP_DTMP_8(type1,pname1,type2,pname2), type1 pname1##9, type2 pname2##9
            #define DP_DTMP_10(type1, pname1, type2, pname2) DP_DTMP_9(type1,pname1,type2,pname2), type1 pname1##10, type2 pname2##10


            //   DP = DEFINE PARAM 定義參數(shù)
            //   MTMP = MULTI TYPE MULTI PARAM 多類型多參數(shù)
            //   用來創(chuàng)建諸如 Tp1 p1, Tp2 p2, Tp3 p3 這樣形式的參數(shù)表
            //   比如
            //   DP_MTMP_2(Tp, p ); 就相當于
            //   Tp1 p1, Tp2 p2

            #define DP_MTMP_0(type,name)
            #define DP_MTMP_1(type,name) type##1 name##1
            #define DP_MTMP_2(type,name) DP_MTMP_1(type,name), type##2 name##2
            #define DP_MTMP_3(type,name) DP_MTMP_2(type,name), type##3 name##3
            #define DP_MTMP_4(type,name) DP_MTMP_3(type,name), type##4 name##4
            #define DP_MTMP_5(type,name) DP_MTMP_4(type,name), type##5 name##5
            #define DP_MTMP_6(type,name) DP_MTMP_5(type,name), type##6 name##6
            #define DP_MTMP_7(type,name) DP_MTMP_6(type,name), type##7 name##7
            #define DP_MTMP_8(type,name) DP_MTMP_7(type,name), type##8 name##8
            #define DP_MTMP_9(type,name) DP_MTMP_8(type,name), type##9 name##9
            #define DP_MTMP_10(type,name) DP_MTMP_9(type,name), type##10 name##10



            //   LP = LIST PARAM 列出參數(shù)
            //   SNMP = SINGLE NAME MULTI PARAM 單名字多參數(shù)
            //   比如
            //   LP_SNMP_2(p); 就相當于
            //   p1, p2

            #define LP_SNMP_0(pname)
            #define LP_SNMP_1(pname) pname##1
            #define LP_SNMP_2(pname) LP_SNMP_1(pname), pname##2
            #define LP_SNMP_3(pname) LP_SNMP_2(pname), pname##3
            #define LP_SNMP_4(pname) LP_SNMP_3(pname), pname##4
            #define LP_SNMP_5(pname) LP_SNMP_4(pname), pname##5
            #define LP_SNMP_6(pname) LP_SNMP_5(pname), pname##6
            #define LP_SNMP_7(pname) LP_SNMP_6(pname), pname##7
            #define LP_SNMP_8(pname) LP_SNMP_7(pname), pname##8
            #define LP_SNMP_9(pname) LP_SNMP_8(pname), pname##9
            #define LP_SNMP_10(pname) LP_SNMP_9(pname), pname##10



            //   LP = LIST PARAM 列出參數(shù)
            //   DNMP= DOUBLE NAME MULTI PARAM 雙名字多參數(shù)
            //   比如
            //   LP_DNMP_2(name, age); 就相當于
            //   name1, age1, name2, age2

            #define LP_DNMP_1(pname1,pname2)
            #define LP_DNMP_1(pname1,pname2) pname1##1,  pname2##1
            #define LP_DNMP_2(pname1,pname2) LP_DNMP_1(pname1,pname2), pname1##2, pname2##2
            #define LP_DNMP_3(pname1,pname2) LP_DNMP_2(pname1,pname2), pname1##3, pname2##3
            #define LP_DNMP_4(pname1,pname2) LP_DNMP_3(pname1,pname2), pname1##4, pname2##4
            #define LP_DNMP_5(pname1,pname2) LP_DNMP_4(pname1,pname2), pname1##5, pname2##5
            #define LP_DNMP_6(pname1,pname2) LP_DNMP_5(pname1,pname2), pname1##6, pname2##6
            #define LP_DNMP_7(pname1,pname2) LP_DNMP_6(pname1,pname2), pname1##7, pname2##7
            #define LP_DNMP_8(pname1,pname2) LP_DNMP_7(pname1,pname2), pname1##8, pname2##8
            #define LP_DNMP_9(pname1,pname2) LP_DNMP_8(pname1,pname2), pname1##9, pname2##9
            #define LP_DNMP_10(pname1,pname2) LP_DNMP_9(pname1,pname2), pname1##10, pname2##10

            posted on 2007-04-18 17:57 飯中淹 閱讀(1892) 評論(4)  編輯 收藏 引用

            評論

            # re: 比較有用的一組構(gòu)造多參數(shù)的C++宏. 2007-04-18 21:10 夢在天涯
            看起來根loki庫中的typelist有點像!

            哈哈
            !  回復(fù)  更多評論
              

            # re: 比較有用的一組構(gòu)造多參數(shù)的C++宏. 2007-04-19 11:40 Kooyu
            這種“技巧”似乎基本沒用。  回復(fù)  更多評論
              

            # re: 比較有用的一組構(gòu)造多參數(shù)的C++宏. 2007-04-19 14:52 飯中淹
            這不是技巧.......
            下面是我應(yīng)用的地方....

            1- 帶參數(shù)的placement new封裝
            #define DEFINE_CALL_CON( paramcount ) template <class T, DP_STMP_##paramcount( typename, tp ) >\
            inline T * CALL_CON( T * ptMem, DP_MTMP_##paramcount( tp, p ) ){\
            T * pt = new(ptMem)T( LP_SNMP_##paramcount( p ) );\
            return pt;\
            }

            DEFINE_CALL_CON(1);
            DEFINE_CALL_CON(2);
            DEFINE_CALL_CON(3);
            DEFINE_CALL_CON(4);
            DEFINE_CALL_CON(5);
            DEFINE_CALL_CON(6);
            DEFINE_CALL_CON(7);
            DEFINE_CALL_CON(8);
            DEFINE_CALL_CON(9);
            DEFINE_CALL_CON(10);

            template <class T>
            inline T * CALL_CON( T * ptMem )
            {
            T * pt = new(ptMem)T;
            return pt;
            }

            template <class T>
            inline void CALL_DEC( T * pt )
            {
            pt->~T();
            }

            2- 內(nèi)存池里創(chuàng)建帶參數(shù)類對象用的

            #define DEFINE_NEW_OBJECT(paramnumber) template <class T, DP_STMP_##paramnumber( typename, Tp )>\
            T * POOL_NewObject( DP_MTMP_##paramnumber( Tp, p ) )\
            {\
            T * p = (T*)POOL_New( sizeof( T ) );\
            if( p != NULL )\
            CALL_CON( p, LP_SNMP_##paramnumber(p) );\
            return p;\
            }

            DEFINE_NEW_OBJECT(1);
            DEFINE_NEW_OBJECT(2);
            DEFINE_NEW_OBJECT(3);
            DEFINE_NEW_OBJECT(4);
            DEFINE_NEW_OBJECT(5);
            DEFINE_NEW_OBJECT(6);
            DEFINE_NEW_OBJECT(7);
            DEFINE_NEW_OBJECT(8);
            DEFINE_NEW_OBJECT(9);
            DEFINE_NEW_OBJECT(10);



            template <class T>
            T * POOL_NewObject( )
            {
            T * p = (T*)POOL_New( sizeof( T ) );
            if( p != NULL )
            CALL_CON( p );
            return p;
            }


            3- 構(gòu)造特性提取的缺省構(gòu)造....
            #define DEFINE_DEFCON_WITHPARAM( paramcount ) template <DP_STMP_##paramcount( typename, tp )>\
            static inline T * con( LPVOID lpMem, DP_MTMP_##paramcount( tp, p ) ){return CALL_CON( (T*)lpMem, LP_SNMP_##paramcount( p ) );}


            template < class T>
            struct object_con_trait
            {
            static inline T * conCopy( LPVOID lpMem, const T & v )
            {
            return CALL_CON<T, const T&>( (T*)lpMem, v );
            }
            DEFINE_DEFCON_WITHPARAM( 1 );
            DEFINE_DEFCON_WITHPARAM( 2 );
            DEFINE_DEFCON_WITHPARAM( 3 );
            DEFINE_DEFCON_WITHPARAM( 4 );
            DEFINE_DEFCON_WITHPARAM( 5 );
            DEFINE_DEFCON_WITHPARAM( 6 );
            DEFINE_DEFCON_WITHPARAM( 7 );
            DEFINE_DEFCON_WITHPARAM( 8 );
            DEFINE_DEFCON_WITHPARAM( 9 );
            DEFINE_DEFCON_WITHPARAM( 10 );

            static inline T * con( LPVOID lpMem )
            {
            return CALL_CON( (T*)lpMem );
            }

            static inline T * conArray( LPVOID lpMem, size_t count )
            {
            //LPVOID lpNewMem = (LPVOID)(((int*)lpMem)-1);
            //int orgMem = *(int*)lpNewMem;
            //new (lpNewMem) T[count];
            //*(int*)lpNewMem = orgMem;
            T * pv = (T*)lpMem;
            for( size_t i = 0;i < count;i ++ )
            CALL_CON(pv+i);
            return (T*)lpMem;
            }
            };  回復(fù)  更多評論
              

            # re: 比較有用的一組構(gòu)造多參數(shù)的C++宏.[未登錄] 2007-04-23 09:36 hdqqq
            你可以取看看boost中的preprocessor 部分,講的是預(yù)處理元編程,你這個宏的功能和boost 中的BOOST_PP_ENUM_PARAMS 宏功能類似.  回復(fù)  更多評論
              


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            午夜视频久久久久一区| 久久男人中文字幕资源站| 久久久久久亚洲Av无码精品专口 | 色综合久久久久无码专区| 久久天天躁狠狠躁夜夜网站| 夜夜亚洲天天久久| 久久人妻AV中文字幕| 青青青国产成人久久111网站| 久久综合狠狠综合久久97色| 久久天天躁狠狠躁夜夜躁2O2O | 国产日韩久久久精品影院首页| 久久93精品国产91久久综合| 亚洲精品国精品久久99热一| 国产精品VIDEOSSEX久久发布| 伊人精品久久久久7777| 久久精品国产免费一区| 天天躁日日躁狠狠久久| 久久综合九色欧美综合狠狠| 亚洲国产精品热久久| 久久夜色精品国产噜噜麻豆| 久久受www免费人成_看片中文| 精品国产热久久久福利| 国产一区二区三区久久精品| 久久亚洲AV成人无码国产 | 久久夜色精品国产| 99久久精品无码一区二区毛片| 久久精品国产99久久久| 久久亚洲AV成人出白浆无码国产| 久久国内免费视频| 一本色道久久88综合日韩精品| 国产精品丝袜久久久久久不卡| 久久香蕉国产线看观看乱码| 久久久无码一区二区三区| 久久亚洲精品国产精品| 久久久久久午夜成人影院| 久久精品水蜜桃av综合天堂| 日韩AV无码久久一区二区| 久久精品国产亚洲av麻豆色欲| 久久精品国产第一区二区三区| 成人久久综合网| 青青草原综合久久大伊人精品|