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

cpp小菜園

簡單即是複雜

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  2 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks

常用鏈接

留言簿(3)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜


  最近(其實也有一段時間了),在c++項目中需要用到類似java的反射機制,時間也比較趕,只能周圍看看有沒有現成的庫可用了,找到的資料也不算少,但多數都是關于動態創建類的,有點像工廠模式,而我需要的,是把實體類中的屬性反射出來。最后,找到了一個叫LibReflection的東西,雖然后來還是沒用上這個,但是稍微看了一下代碼,還是有不少收獲,所以就在這里記錄下來了,當做學習,也當做對這個庫的一個分析吧。
  LibReflection是屬性和函數反射都有實現的,而整個庫竟然就一個h文件,本人精力有限,只把屬性反射抽取出來,相信離實際應用也有距離,如果有人路過看到,請體諒別拍磚了。
  那么,首先看一下使用:

    TestClass inst;
    tat::tat_class *test_class = TestClass::get_class_ptr();
    std::map<std::string,tat::tat_field> field_map = test_class->get_fields();
    tat::tat_field test_vec_field = field_map.find("_vec_f")->second;
    std::vector<int> vec;
    test_vec_field.get(&inst,vec);
    vec.push_back(22);
    test_vec_field.set(&inst,vec);
    std::cout<<inst._vec_f[0]<<std::endl;

  TestClass類先不給出,反正就是該類有一個名字為“_vec_f”的屬性,類型是std::vector<int>,然后這段代碼通過反射修改_vec_f的內容。。至于tat_class和tat_field,相信熟悉java的人都能猜出是什么了。
  獲取及設置一個實例的成員變量的值不是難事,用一個宏就可以了:

#define _OFFSET_(_Obj_Ty,_Key)                                                    \
    ((unsigned long)(&((_Obj_Ty *)0)->_Key))

   這個宏應該也不難理解,就是獲取成員變量相對實例指針的偏移值。而關鍵問題是,如何通過變量名稱就能查找出這個偏移呢?如何在變量初始化的時候就能記錄下這個偏移呢?我們可以通過宏來聲明變量,那么聲明的時候就可以做一些事情了,但具體做些什么,還是沒頭緒。
  這個問題自己思考了一段時間,無果。然后看了一下實現,深感自己的基礎還沒過關,其實說白了就是兩個東西:構造函數、靜態成員變量。
  我們的目標是很明確的,要做到java的效果,結合上面那個宏,也不難想象出Class和Field類的樣子(這里是tat_class和tat_field),tat_class無非就是保存了一個map,key是屬性的名稱,value是tat_field,至于tat_field就簡單了,核心就是保存內存的偏移值,再提供操作值的接口就可以了。
  先來看看tat_class:

    class tat_class
    {
    private:
        std::map<std::string,tat_field> _field_map;
        std::string _key;
    public:
        std::map<std::string,tat_field> get_fields()
        {
            return this->_field_map;
        }
        tat_field get_field(std::string key)
        {
            std::map<std::string,tat_field>::iterator itr = _field_map.find(key);
            return (*itr).second;
        }
        void add_field(const tat_field &field)
        {
            _field_map.insert(std::pair<std::string,tat_field>(field.get_key(),field));
        }
    };

  沒有什么理解上的難點吧。
  然后看看tat_field:

    class tat_field
    {
    private:
        unsigned long _offset;
        std::string _key;
    public:
        tat_field(unsigned long offset,std::string key):_offset(offset),_key(key){}
        tat_field(const tat_field &field)
        {
            this->_offset = field._offset;
            this->_key = field._key;
        }
    public:
        template<typename _Obj_Ty,typename _Value_Ty>
        void get(_Obj_Ty *obj,_Value_Ty &value)
        {
            value = *((_Value_Ty *)((unsigned char *)obj + _offset));
        }
        template<typename _Obj_Ty,typename _Value_Ty>
        void set(_Obj_Ty *obj,const _Value_Ty &value)
        {
            *((_Value_Ty *)((unsigned char *)obj + _offset)) = value;
        }
        std::string get_key() const
        {
            return this->_key;
        }
    };

  變量值的get和set函數使用了模板,這是為了使用的時候能作簡單的類型推斷。
  然后就是重點了,如何在聲明類的時候就把tat_class注入呢?如前面說的,靜態成員變量:

#define CLASS_REGISTER(_Obj_Ty)                                                    \
public:                                                                            \
    static tat::tat_class * get_class_ptr()                                        \
    {                                                                            \
        static tat::tat_class __class_##_Obj_Key##__;                            \
        return &__class_##_Obj_Key##__;                                            \
    }

  這個宏做了兩件事:第一,聲明靜態函數get_class_ptr(),返回tat_class類型,第二,當然就是初始化tat_class了,因為同樣是靜態,所以不同的實例就共享了。
  接下來是另一個重點,如何在聲明成員變量的時候把tat_field注入到tat_class中,還是用宏解決:

#define FIELD_REGISTER(_Access,_Field_Ty,_Field_Key,_Obj_Ty)                    \
_Access:                                                                        \
    _Field_Ty _Field_Key;                                                        \
private:                                                                        \
    class __field_register_##_Field_Key##__                                        \
    {                                                                            \
    public:                                                                        \
        __field_register_##_Field_Key##__()                                        \
        {                                                                        \
            static tat::__field_register__ reg_##_Field_Key(                    \
                _Obj_Ty::get_class_ptr(),                                        \
                _OFFSET_(_Obj_Ty,_Field_Key),                                    \
                #_Field_Key);                                                    \
        }                                                                        \
    }_Field_Key##_register;

  分析這個宏,首先當然是聲明變量了;然后就是一個神秘的類:__field_register_##_Field_Key##__,這個類就只有一個構造函數,構造函數里面又是一個靜態變量,類型是tat::__field_register__,可以想象得到,既然tat_class已經可以聲明出來了,tat_field自然也沒有難度,但聲明是不足夠的,還需要放到tat_class的map里面才算完成,在聲明一個變量的時候,能做事的地方,我只能想到是構造函數了,所以就有了剛剛那個神秘的類,那個類的唯一作用就是其構造函數,而構造函數里面聲明靜態變量,則是防止多次實例化類帶來的冗余數據,確保一個成員變量只有一個tat_field;
  剩下的關鍵,就是tat::__field_register__了:

    class __field_register__
    {
    public:
        __field_register__(tat_class *class_ptr,unsigned long offset,std::string key)
        {
            tat_field field(offset,key);
            class_ptr->add_field(field);
        }
    };

  沒有什么神秘的地方,這個東西就這么完成了。
  差點忘了TestClass的聲明:

#include "fieldref.h"

class TestClass
{
public:
    TestClass(void);
    ~TestClass(void);

    CLASS_REGISTER(TestClass)
    FIELD_REGISTER(public,long,_long_f,TestClass)
    FIELD_REGISTER(public,int,_int_f,TestClass)
    FIELD_REGISTER(public,std::string,_str_f,TestClass)
    FIELD_REGISTER(public,std::vector<int>,_vec_f,TestClass)
};

  好吧,如果說到實際應用的問題,灑家確實沒有考慮太多,反正測試函數能跑,結果也對了,灑家也就滿足了,就單純的當做是一次實驗,或者是學習而已。
posted on 2012-04-25 13:18 閱讀(4073) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   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>
            亚洲欧美日韩在线综合| 午夜精品久久久| 国产精品第一页第二页第三页| 久久久久久久999| 久久九九99| 欧美福利一区二区三区| 欧美精品国产精品日韩精品| 欧美日韩国产成人在线免费 | 另类亚洲自拍| 欧美成人精品三级在线观看| 亚洲国产精品视频一区| 欧美粗暴jizz性欧美20| 亚洲伦理网站| 欧美一区二区私人影院日本 | 欧美日韩视频第一区| 国产精品毛片a∨一区二区三区|国| 国产精品一区二区三区久久久| 激情av一区二区| 在线一区二区三区四区| 久久九九精品99国产精品| 亚洲第一级黄色片| 日韩写真视频在线观看| 午夜欧美不卡精品aaaaa| 美女视频黄免费的久久| 亚洲美女91| 久久蜜桃资源一区二区老牛| 欧美日韩一区二区在线观看视频| 国产日韩在线播放| 日韩亚洲在线观看| 久久蜜臀精品av| 一区二区三区高清视频在线观看| 久久精视频免费在线久久完整在线看| 欧美日一区二区在线观看| 在线精品视频在线观看高清| 亚洲一区二区欧美日韩| 亚洲国产一区二区三区青草影视| 亚洲欧美日韩天堂一区二区| 欧美精品一区二区在线播放| 亚洲第一黄色| 久久久久9999亚洲精品| 99国内精品久久| 欧美黄色免费网站| 亚洲激情自拍| 玖玖精品视频| 久久国产精品久久久久久久久久| 国产精品九九久久久久久久| 一区二区激情小说| 欧美激情精品久久久久久| 久久久久久九九九九| 国产视频在线观看一区| 欧美亚洲一区| 亚洲男人的天堂在线aⅴ视频| 欧美日韩免费观看中文| 日韩性生活视频| 亚洲精品一区在线| 欧美男人的天堂| 日韩一二三区视频| 日韩天堂av| 国产精品看片你懂得| 亚洲综合首页| 亚洲综合首页| 国产主播一区二区| 美女黄毛**国产精品啪啪 | 欧美日韩在线另类| 亚洲久久一区| 夜夜嗨一区二区| 国产精品国产福利国产秒拍| 亚洲午夜在线观看视频在线| 一本色道久久综合| 国产精品久久久久久久久免费桃花 | 日韩视频二区| 日韩视频免费观看高清在线视频| 欧美精品一区二区三区很污很色的 | 一本色道婷婷久久欧美| 欧美二区在线| 日韩午夜电影av| 欧美午夜欧美| 性伦欧美刺激片在线观看| 午夜精品久久久久久久男人的天堂| 国产精品日韩专区| 久久免费视频在线| 欧美高清视频在线播放| 亚洲一区二区动漫| 亚洲综合99| 亚洲国产成人午夜在线一区| 亚洲人被黑人高潮完整版| 国产精品扒开腿爽爽爽视频| 久久精品国产在热久久 | 久久久久久久精| 欧美华人在线视频| 欧美在线一二三四区| 麻豆av福利av久久av| 中国成人在线视频| 久久久天天操| 亚洲一区二区动漫| 久久―日本道色综合久久| 一区二区三区精品国产| 久久精品在线视频| 亚洲一区综合| 免费欧美日韩国产三级电影| 午夜久久久久久| 欧美精品性视频| 麻豆九一精品爱看视频在线观看免费| 欧美日韩精品| 欧美sm极限捆绑bd| 国产精品免费看| 最新日韩中文字幕| 狠狠色狠狠色综合日日五| 99视频超级精品| 91久久夜色精品国产网站| 亚洲一区二区三区高清| 亚洲伦伦在线| 久久久精品五月天| 欧美一级一区| 国产精品mm| 亚洲美女性视频| 亚洲高清av| 久久精品国产亚洲精品| 性欧美xxxx大乳国产app| 欧美日韩亚洲在线| 亚洲国产欧美日韩| 曰韩精品一区二区| 欧美一区二区三区免费视| 一本色道久久综合亚洲精品不 | 国产精品久久久久久福利一牛影视| 欧美搞黄网站| 伊人一区二区三区久久精品| 亚洲淫片在线视频| 亚洲资源在线观看| 欧美日韩免费精品| 99re国产精品| 亚洲在线视频网站| 欧美少妇一区| 中文久久乱码一区二区| 中文在线不卡| 国产精品xxxxx| 午夜视频在线观看一区二区| 欧美日韩色一区| 亚洲乱码国产乱码精品精天堂| 亚洲精品色婷婷福利天堂| 久久婷婷蜜乳一本欲蜜臀| 美国十次了思思久久精品导航| 黄色国产精品一区二区三区| 久久久www成人免费精品| 久久亚洲一区二区| 91久久香蕉国产日韩欧美9色| 噜噜噜躁狠狠躁狠狠精品视频| 欧美成人高清视频| 亚洲精品影视在线观看| 欧美国产成人精品| 一级成人国产| 久久精品99久久香蕉国产色戒| 国产日韩欧美一区在线 | 欧美激情1区2区3区| 最新成人av在线| 欧美日韩四区| 亚洲欧美经典视频| 女人天堂亚洲aⅴ在线观看| 在线免费观看视频一区| 欧美紧缚bdsm在线视频| 亚洲视频一二| 六月婷婷久久| 一本久道久久综合狠狠爱| 国产精品九九久久久久久久| 午夜视频一区在线观看| 欧美激情偷拍| 午夜精品久久久久久久蜜桃app | 欧美激情一区二区三级高清视频 | 亚洲午夜一区二区| 国产无一区二区| 欧美高潮视频| 亚洲欧美国产精品桃花| 欧美大片在线看免费观看| 亚洲一区二区动漫| 亚洲国产专区校园欧美| 国产精品高精视频免费| 久久亚洲春色中文字幕久久久| 99re热这里只有精品视频 | 亚洲欧美在线视频观看| 伊甸园精品99久久久久久| 欧美日韩精品一区视频| 久久精品中文字幕一区| 一区二区三区日韩精品| 欧美高清一区| 久久婷婷丁香| 欧美一区二区三区免费观看| 亚洲精品在线观看免费| 国内久久视频| 国产精品国产精品国产专区不蜜| 久久亚洲春色中文字幕| 亚洲欧洲99久久| 日韩亚洲欧美一区| 欧美国产高清| 久久三级视频| 欧美在线视频免费| 亚洲男人第一网站| 一区二区三区视频免费在线观看| 黄色日韩网站| 久色成人在线| 欧美在线在线|