青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

歲月流轉,往昔空明

C++博客 首頁 新隨筆 聯系 聚合 管理
  118 Posts :: 3 Stories :: 413 Comments :: 0 Trackbacks
這個設計主要是拿來保證跨組件的時候能盡可能的保護型別安全.

我今天晚上早些時候也往SoftArt里面提交了一個type to id的實現,使用宏和特化機制
但是這個版本的一個很大的問題就在于用起來不是很方便,每注冊一個類需要2行代碼,而且都是
#define PARAM float
#include REGTYPE()
這樣的非常規的宏用法.
但是由于它是分類實現的,所以可以在里面補充一些額外的功能,比如自動的具名常量的生成.

所以晚上回來的時候又用boost的mpl寫了一個原形,基本上是純模板的.注冊類只需要一行,但是宏實現版本中一些半自動化的特點也損失的差不多了.
回頭還是要考慮用preprocessor結合MPL,看看能不能做到兩個特點兼備.

mingw + gcc 4.2.1下通過

#include <iostream>
#include 
<boost/smart_ptr.hpp>

#include 
<boost/mpl/vector.hpp>
#include 
<boost/mpl/find.hpp>
#include 
<boost/mpl/at.hpp>
#include 
<boost/mpl/size.hpp>
#include 
<boost/mpl/if.hpp>
#include 
<boost/mpl/less.hpp>
#include 
<boost/mpl/int.hpp>
#include 
<boost/mpl/less_equal.hpp>

#include 
<boost/type_traits/is_same.hpp>

using namespace std;

struct empty{};

#define BEGIN_REGISTER_TYPE() typedef boost::mpl::vector<empty
#define REGISTER_TYPE(type) ,type
#define END_REGISTER_TYPE() > typelst;

namespace shader_constant
{
    BEGIN_REGISTER_TYPE()
        REGISTER_TYPE(
int)
        REGISTER_TYPE(
float)
        REGISTER_TYPE(
bool)
    END_REGISTER_TYPE();

    
static const int size_of_typelst = boost::mpl::size<typelst>::value;
    typedef boost::mpl::int_
<size_of_typelst> size_of_typelst_t;

    template
<class T>
    
struct type2id{
        typedef typename boost::mpl::find
<typelst, T>::type iter;
        
static const int id =
            boost::mpl::if_
<
                boost::is_same
<boost::mpl::end<typelst>::type, iter>,
                boost::mpl::int_
<0>,
                typename iter::pos
            
>::type::value;
    }
;

    template
<int id>
    
struct id2type{
        typedef boost::mpl::int_
<id> int_id;
        typedef boost::mpl::int_
<0> int_0;

        
//type = (0 < id && id <= size) ? typelst[id] : empty;
        typedef typename boost::mpl::if_<
            boost::mpl::and_
<
                boost::mpl::less
<int_0, int_id >,
                boost::mpl::less_equal
<int_id, boost::mpl::size<typelst>::type >
            
>,
            typename boost::mpl::at
<typelst, int_id>::type,
            empty
        
>::type type;
    }
;
}


using namespace shader_constant;

typedef 
void (*Assignments)(void* p1, void* p2);

template
<class T>
void AssignImpl(void* p1, void* p2)
{
    cout 
<< typeid(T).name() << endl;
    
*(T*)p1 = *(T*)p2;
}


template 
<> void AssignImpl<empty>(void* p1, void* p2)
{
    cout 
<< "error type!" << endl;
}


 Assignments assigns[size_of_typelst
+1];

template 
<int i>
struct assigns_initializer
{
    assigns_initializer
<i-1> m;
    assigns_initializer()
{
        assigns[i] 
= &AssignImpl<typename id2type<i>::type >;
        }

}
;

template 
<>
struct assigns_initializer<-1>
{
    assigns_initializer()
{
        }

}
;

static assigns_initializer<size_of_typelst> ai;

typedef 
double T;
int main()
{
    T i1(T(
0));
    T i2(T(
10));
    assigns[type2id
<T>::id](&i1, &i2);
    cout 
<< i1;
    system(
"pause");
    
return 0;
}

posted on 2008-03-08 00:55 空明流轉 閱讀(1316) 評論(4)  編輯 收藏 引用

評論

# re: 一個type2id的程序 2008-03-08 15:53 空明流轉
新的實現,覺得還是這個好一點.
 
#include <iostream>
#include 
<boost/smart_ptr.hpp>

#include 
<boost/mpl/vector.hpp>
#include 
<boost/mpl/find.hpp>
#include 
<boost/mpl/at.hpp>
#include 
<boost/mpl/size.hpp>
#include 
<boost/mpl/if.hpp>
#include 
<boost/mpl/less.hpp>
#include 
<boost/mpl/int.hpp>
#include 
<boost/mpl/less_equal.hpp>

#include 
<boost/type_traits/is_same.hpp>
#include 
<boost/preprocessor/seq/for_each.hpp>
#include 
<boost/preprocessor/seq/for_each_i.hpp>

using namespace std;

struct empty{};

#define TYPE_LST \
(empty) \
(
bool)(float)(int)

#define BEGIN_ENUM() enum ENUM_NAME {
#define REG_ENUM(r, data, i, type_elem) BOOST_PP_CAT(ENUM_PRED, type_elem) = i,
#define END_ENUM() };

#define BEGIN_ENCODE_DECODE()    \
template
<class T>    struct type_encodestatic const int id = 0static const ENUM_NAME tag = ENUM_NAME(0); };\
template
<int i> struct type_decode{ typedef empty type;};

#define REGISTER_TYPE(r, dummy, i, type_elem) \
template
<> struct type_encode< type_elem >{static const int id = i; static const ENUM_NAME tag = ENUM_NAME(i);};\
template
<> struct type_decode< i >{typedef type_elem type;};

#define END_ENCODE_DECODE()
enum s{
    ebool
}
;

namespace shader_constant
{
    
#define ENUM_NAME sh_typeids
    
#define ENUM_PRED sh_typeids
    
#define ENUM_POST
    BEGIN_ENUM()
    BOOST_PP_SEQ_FOR_EACH_I(REG_ENUM, _, TYPE_LST)
    END_ENUM()

    BEGIN_ENCODE_DECODE()
    BOOST_PP_SEQ_FOR_EACH_I(REGISTER_TYPE, _, TYPE_LST)
    END_ENCODE_DECODE()

    
const int size_of_typelst = BOOST_PP_SEQ_SIZE(TYPE_LST);
}


using namespace shader_constant;

typedef 
void (*Assignments)(void* p1, void* p2);

template
<class T>
void AssignImpl(void* p1, void* p2)
{
    cout 
<< typeid(T).name() << endl;
    
*(T*)p1 = *(T*)p2;
}


template 
<> void AssignImpl<empty>(void* p1, void* p2)
{
    cout 
<< "error type!" << endl;
}


 Assignments assigns[size_of_typelst
+1];

template 
<int i>
struct assigns_initializer
{
    assigns_initializer
<i-1> m;
    assigns_initializer()
{
        assigns[i] 
= &AssignImpl<typename type_decode<i>::type >;
        }

}
;

template 
<>
struct assigns_initializer<-1>
{
    assigns_initializer()
{
        }

}
;

static assigns_initializer<size_of_typelst> ai;

typedef 
double T;
int main()
{
    T i1(T(
0));
    T i2(T(
10));
    assigns[type_encode
<T>::id](&i1, &i2);
    cout 
<< i1;
    system(
"pause");
    
return 0;
}

  回復  更多評論
  

# re: 一個type2id的程序 2008-03-08 22:28 橙子
可有看過《C++設計新思維》 ?
里面有一章Typtlist,專門講這個。你這個看起來很高深。  回復  更多評論
  

# re: 一個type2id的程序 2008-03-09 11:39 空明流轉
typelist有typelist不妥的地方。
我的原帖解法就是typelist的(boost::mpl::vector)。
但是typelst的解法中,它的類型名稱信息只能用一次,而我在做枚舉或者別的時候需要再次利用這個類型名稱生成合適的枚舉值名稱或者別的什么。
所以我用了boost的preprocessor作為確定序列的工具。  回復  更多評論
  

# re: 一個type2id的程序 2008-03-21 19:06 李錦俊
空明你的程序我越來越怕了。那么多宏+模板,暈啊。  回復  更多評論
  


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久久在线视频| 91久久国产综合久久| 国产精品www网站| 欧美精品v国产精品v日韩精品 | 亚洲欧美怡红院| 亚洲天堂第二页| 亚洲婷婷国产精品电影人久久| 亚洲一区二区三区乱码aⅴ| 亚洲在线成人| 久久九九99| 欧美 日韩 国产一区二区在线视频| 美女91精品| 亚洲欧洲精品一区二区三区不卡| 亚洲人成7777| 99香蕉国产精品偷在线观看| 亚洲最新在线视频| 欧美亚洲网站| 欧美国产专区| 中文精品视频| 久久久久www| 欧美日韩成人一区| 国产日韩精品电影| 亚洲国产精品久久人人爱蜜臀| 一区二区三区精品国产| 欧美专区在线播放| 欧美激情精品久久久久久黑人 | 久久国产日韩| 欧美日韩国产成人精品| 国产精品午夜在线观看| 在线成人免费视频| 亚洲欧美日韩国产综合精品二区| 久久久综合精品| 亚洲精品一区久久久久久 | 欧美视频日韩视频在线观看| 国产日韩欧美在线| 一区二区三区日韩欧美| 欧美**人妖| 欧美在线视频观看免费网站| 欧美精品系列| 亚洲精品久久久久久久久久久久| 久久精品水蜜桃av综合天堂| 99在线热播精品免费99热| 久久先锋资源| 国产一区91精品张津瑜| 亚洲女优在线| 中文亚洲字幕| 欧美日韩一区二区在线| 亚洲国产岛国毛片在线| 久久久综合免费视频| 午夜精品亚洲| 国产精品爽爽爽| 午夜精品久久久久久久99水蜜桃| 蜜桃av噜噜一区二区三区| 性欧美1819sex性高清| 亚洲高清成人| 久久嫩草精品久久久精品一| 国产精品嫩草久久久久| 一区二区毛片| 亚洲伦理一区| 欧美超级免费视 在线| 国内综合精品午夜久久资源| 午夜精品久久久久久久99水蜜桃 | 国产一级久久| 久久狠狠婷婷| 午夜一区不卡| 欧美亚洲免费高清在线观看| 国产精品试看| 亚洲综合好骚| 亚洲夜间福利| 国产精品一区二区三区四区| 亚洲自拍另类| 亚洲欧美日韩精品| 国产视频在线观看一区二区三区| 久久aⅴ乱码一区二区三区| 午夜精品短视频| 国产亚洲人成a一在线v站| 久久久人成影片一区二区三区| 欧美伊人影院| 91久久在线观看| 日韩午夜高潮| 国产视频丨精品|在线观看| 裸体一区二区三区| 欧美精品一区二区三区久久久竹菊| 99国产欧美久久久精品| 亚洲一区免费观看| 在线观看三级视频欧美| 亚洲国产精品成人久久综合一区| 欧美精品国产精品| 午夜精品国产| 裸体歌舞表演一区二区| 一区二区不卡在线视频 午夜欧美不卡'| 日韩一级黄色片| 国产一区二区三区在线观看免费 | 狠狠色丁香久久婷婷综合丁香| 欧美成人嫩草网站| 国产精品久久久久久妇女6080| 久久精品亚洲一区二区| 欧美二区视频| 久久精品亚洲| 欧美日韩一区二区三区在线视频| 久久久久国产精品午夜一区| 欧美激情综合色| 久久久久一区二区三区| 欧美日韩1区2区| 久久女同精品一区二区| 欧美精品一区在线发布| 久久亚洲精品一区| 国产精品成人一区二区艾草| 老色批av在线精品| 国产一区二区无遮挡| 日韩亚洲欧美中文三级| 欧美在线电影| 亚洲欧美日韩在线播放| 欧美成人午夜激情视频| 久久黄色小说| 国产精品扒开腿爽爽爽视频| 欧美电影免费观看高清完整版| 国产精品久久久久久亚洲调教| 欧美激情亚洲国产| 国产一区二区三区四区五区美女| 99国产精品99久久久久久粉嫩| 一色屋精品亚洲香蕉网站| 亚洲在线观看视频网站| 一区二区三区四区在线| 农夫在线精品视频免费观看| 久久精品亚洲精品| 国产欧美日韩在线视频| 制服丝袜激情欧洲亚洲| 99re66热这里只有精品3直播| 久久综合99re88久久爱| 久久中文欧美| 精品av久久久久电影| 欧美在线视频a| 好吊色欧美一区二区三区四区| 亚洲视频一区二区在线观看| 亚洲精品国产无天堂网2021| 久久手机免费观看| 免播放器亚洲一区| 一区二区三区在线观看视频| 欧美在线观看一区二区| 欧美一区二区三区婷婷月色| 国产精品嫩草影院一区二区| 亚洲一区二区成人在线观看| 亚洲欧美日韩在线播放| 国产乱码精品一区二区三区av | 中文av字幕一区| 亚洲影院高清在线| 国产精品入口| 欧美资源在线| 欧美二区在线播放| 亚洲免费精品| 国产精品久久久久国产精品日日 | 一区二区精品在线观看| 欧美少妇一区二区| 亚洲欧美激情在线视频| 欧美在线视频一区二区三区| 国产亚洲一级| 噜噜噜久久亚洲精品国产品小说| 亚洲高清毛片| 亚洲天堂黄色| 国内精品视频666| 欧美成人tv| 亚洲天堂网站在线观看视频| 久久国产手机看片| 亚洲精品久久嫩草网站秘色| 欧美日韩一区二区在线播放| 欧美亚洲免费电影| 亚洲国产精品久久久久久女王| 亚洲深夜av| 国产在线拍偷自揄拍精品| 欧美高清免费| 午夜精品视频在线观看一区二区| 欧美 日韩 国产精品免费观看| 一级成人国产| 久久久夜精品| 亚洲国产成人久久| 亚洲女同在线| 亚洲黄色免费电影| 国产精品啊v在线| 久久久久亚洲综合| 中文欧美字幕免费| 亚洲大片免费看| 欧美与黑人午夜性猛交久久久| 亚洲高清久久久| 国产精品色网| 欧美精品www在线观看| 性欧美8khd高清极品| 亚洲精品一区在线| 亚洲视频在线二区| 伊人久久婷婷| 国产麻豆午夜三级精品| 欧美高清视频| 久久手机免费观看| 欧美在线|欧美| 在线亚洲欧美| 亚洲精品视频在线观看网站 | 国产精品一二一区| 免费成人高清| 久久国产精品99久久久久久老狼 | 国产综合网站|