• <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ù)  更多評論
              

            精品无码久久久久久久动漫| 国产亚洲精品久久久久秋霞| 中文字幕久久久久人妻| 久久一区二区三区99| 久久亚洲国产午夜精品理论片| 色88久久久久高潮综合影院| 亚洲欧美一区二区三区久久| 久久综合亚洲色HEZYO国产| 国产综合精品久久亚洲| 久久强奷乱码老熟女网站| 亚洲国产日韩欧美综合久久| 久久受www免费人成_看片中文| 久久精品免费一区二区| 久久精品国产99国产精品亚洲| 日产精品久久久久久久| 亚洲精品乱码久久久久久中文字幕| 久久超乳爆乳中文字幕| 97久久超碰国产精品旧版| 欧美日韩中文字幕久久伊人| 久久成人精品| 一本一道久久a久久精品综合| 亚洲精品乱码久久久久久久久久久久 | 久久九九久精品国产免费直播| 久久久久久精品成人免费图片 | 伊人丁香狠狠色综合久久| 青草影院天堂男人久久| 精品久久人人做人人爽综合| 亚洲中文字幕无码久久2017| 久久精品国产亚洲av高清漫画| 久久精品一区二区三区中文字幕| 久久成人国产精品免费软件| 久久天堂AV综合合色蜜桃网| AAA级久久久精品无码区| 国内精品人妻无码久久久影院导航 | 久久99国产综合精品| 久久精品国产精品亚洲| A级毛片无码久久精品免费| 国产2021久久精品| 久久亚洲国产成人精品性色| 久久精品国产欧美日韩| 久久亚洲国产欧洲精品一|