• <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++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              94 隨筆 :: 0 文章 :: 257 評論 :: 0 Trackbacks

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

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

            //   DP = DEFINE PARAM 定義參數
            //   STMP = SINGLE TYPE MULTI PARAM 單類型多參數
            //   下面的是創建 int p1, int p2, int p3這樣形式的參數定義的.
            //   比如
            //   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 定義參數
            //   DTMP = DOUBLE TYPE MULTI PARAM 兩類型多參數
            //   范例
            //   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 定義參數
            //   MTMP = MULTI TYPE MULTI PARAM 多類型多參數
            //   用來創建諸如 Tp1 p1, Tp2 p2, Tp3 p3 這樣形式的參數表
            //   比如
            //   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 列出參數
            //   SNMP = SINGLE NAME MULTI PARAM 單名字多參數
            //   比如
            //   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 列出參數
            //   DNMP= DOUBLE NAME MULTI PARAM 雙名字多參數
            //   比如
            //   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 飯中淹 閱讀(1891) 評論(4)  編輯 收藏 引用

            評論

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

            哈哈
            !  回復  更多評論
              

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

            # re: 比較有用的一組構造多參數的C++宏. 2007-04-19 14:52 飯中淹
            這不是技巧.......
            下面是我應用的地方....

            1- 帶參數的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- 內存池里創建帶參數類對象用的

            #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- 構造特性提取的缺省構造....
            #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;
            }
            };  回復  更多評論
              

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

            欧美日韩精品久久久久| 亚洲一区二区三区日本久久九| 亚洲欧美国产精品专区久久 | 午夜欧美精品久久久久久久| 久久久老熟女一区二区三区| 亚洲综合婷婷久久| 久久精品综合网| 国产精品内射久久久久欢欢| 香蕉久久久久久狠狠色| 久久久久久亚洲AV无码专区| 久久久久国产日韩精品网站 | 久久91亚洲人成电影网站| 狠狠久久综合伊人不卡| 亚洲AV日韩AV天堂久久| 久久国产综合精品五月天| 久久国产乱子伦免费精品| 亚洲伊人久久成综合人影院| 久久久久久狠狠丁香| 中文国产成人精品久久不卡| 久久久久亚洲AV成人网人人网站| 99精品国产在热久久无毒不卡| 久久丫忘忧草产品| 精品久久综合1区2区3区激情 | 国产欧美久久久精品| 亚洲AV无码久久精品色欲| 久久久久久亚洲精品影院| 久久香蕉国产线看观看猫咪?v| 午夜不卡888久久| 青青草原综合久久大伊人精品| 久久香蕉超碰97国产精品| 久久天天躁狠狠躁夜夜avapp| 久久无码一区二区三区少妇| 精品国产乱码久久久久久浪潮 | 久久精品无码午夜福利理论片| 久久亚洲AV无码精品色午夜| 伊人久久五月天| 久久久这里有精品| 伊人久久大香线蕉av一区| 久久综合亚洲色HEZYO社区| 97精品伊人久久久大香线蕉| 久久久久se色偷偷亚洲精品av|