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

huaxiazhihuo

 

完備的運行時類型信息

眾所周知,碼猿寫代碼,自然要求嚴謹周密,殊不知想象力也很重要。本座閱碼幾十年,很是感概很多碼猿的腦洞被大大禁錮,鮮有人能越雷池一步,特別是c++的同學,連同委員會的那一坨老頭子,都很讓人無語至極,出自這些人的作品,都是一個死魚眼睛樣子,千人一面,毫無靈動之生趣可言。stl,boost這些庫都是這樣子(雖然它們確實可以完成大多數(shù)日常任務),更別說其他的庫,沒有什么讓人耳目一新之處。

就說說動態(tài)類型信息這塊,又或者說是反射。自然,語言本身提供的廢物type_info就懶得說了,除了證明c++也東施效顰,也能支持動態(tài)信息之外,就別無用處了,有誰會正兒八經(jīng)的用type_info做點正兒八經(jīng)的事情呢。因此,各路人馬紛紛上陣,都要彌補c++在運行時類型信息上的缺失。因為類型的反射信息實在太重要,或者說,反射的用武之地太多太多,表面上很多事情不需要反射,或者字面代碼上就看不到反射的痕跡,但是內(nèi)里的實現(xiàn),大把大把的反射在發(fā)光發(fā)熱。c++堅持不在動態(tài)信息上給予一點點多余的支持,并不表示c++就不需要反射了,看看標準庫這個極力回避動多態(tài)的典范,是一個怎樣的失敗作品,嗯,這個以后再談吧。假如stl一開始就沒有如此大力排斥動多態(tài),你看看就連內(nèi)存分配的allocator都可以做到靜態(tài)類型信息里面(最新版的c++終于也要接受多態(tài)的allocator,c++界居然一片歡呼鼓舞,真是悲哀),今時今日的c++就不會在很多領(lǐng)域上到處割地求和。

總的來說,現(xiàn)在市面上的c++反射庫,都是侵入式,都學著mfc那一套,都是要求繼承自一個基類Object,然后才能對外提供反射信息的功能,先不說它們提供的類型信息是否完備,這樣子就把用途廣泛限制死在一個很窄很窄的小圈子里面了。這些反射庫,1、不能反射基本類型,int、char、double、const char*、……等;2、不能反射非繼承自O(shè)bject的class或者struct,3、也不能反射模板類,比如vector<int>、list<vector<vector<int>>>。雖然typeid千般弱雞,但也非一無是處,起碼非侵入、平等、多態(tài)。所以,理想的反射,應該像c++原生的typeid那樣無色無味:1、非侵入式的;2、可以對所有的類型都提供反射,基本類型、非Object系的struct或者class、template類型的;3、多態(tài)的,只要改類型需要運行時的類型識別,那么就返回其本身的類型(子類),而非字面上的聲明類型;4、支持類型參數(shù),也即是說,以類型傳遞給該函數(shù)時,就返回相應的類型信息對象。

說得具體一點,我們要求的反射庫是這樣子的。當然,首先要有一個類型信息對象TypeInfo,里面裝滿了關(guān)于對于類型的所有詳細信息。如下所示:可以猜到這種反射下框架,只支持單繼承,這是故意的。
    struct TypeInfo
    {
    
public:
        template
<typename Args>
        
void ConstructObject(void* obj, MemoryAllocator* alloc, Args&& args)const
        
bool IsDerviedOf(const TypeInfo* base)const;

    
public:
        
virtual TIType GetTIType()const = 0;
        
virtual const InterfaceMap* GetInterfaces()const
        
virtual jushort GetMemorySize()const
        
virtual ConstText GetName() const
        
virtual AString GetFullName()const
        
virtual jushort GetAlignSize() const
        
virtual ConstText GetSpaceName()const;
        
virtual const TypeInfo* GetBaseTypeTI()const;
        
virtual const TypeInfo* GetPointeedTI()const
        
virtual size_t GetHashCode(const void* obj)const;
        
virtual bool IsValueType()const { return true; }
        
virtual bool IsClass()const { return true; }

        
virtual bool DoInitAllocator(void* obj, MemoryAllocator* memAlloc)const;
        
virtual bool NeedDestruct()const { return false; }
        
virtual void DoDefaultConstruct(void* obj)const;
        
virtual bool CanDefaultConstruct()const { return true; }
        
virtual void DoAssign(void* dest, const void* src)const;
        
virtual bool Equals(const void* objA, const void* objB)const;
        
virtual void DoDestruct(void* obj)const;
        
    };
然后,就要有一個函數(shù)TypeOf,應該是兩個,一個是無參數(shù)的類型模板函數(shù),可以這樣調(diào)用,TypeOf<type>();一個是有一個參數(shù)的類型模板函數(shù),可以這樣調(diào)用,TypeOf(obj)。不管是那一個,其返回結(jié)果都是const TypeInfo*。TypeOf的要做到的事情是,對于每一種類型,有且只有一個唯一的TypeInfo對象與之對應,不管是template的還是非template的;比如,以下的幾個判斷必須成立。
TypeOf<int>() == TypeOf<int>();
TypeOf<int>() == TypeOf(n);    //n為整型
TypeOf<vector<int>>() == TypeOf(nums);//nums的類型為vector<int>
Object* a = new ObjectA; TypeOf(a) == TypeOf<ObjectA>();
其實這里面的原理也沒什么神奇,無非就是trait配合sfine,接下來就全部都是苦力活,就是為每一種類型都專門特化一個詳細描述的類型對象,用宏可以節(jié)省大量的代碼。但是整個反射庫,本座前前后后重構(gòu)了十幾次,現(xiàn)在也還在重構(gòu)之中,終究還是解決了開發(fā)上所遇到的各種事情。比如,序列化(支持指針、支持多態(tài))、對象與xml的互換、對象與json的互換、數(shù)據(jù)庫表讀寫對象、格式化、Any類型、非侵入式接口、消息發(fā)送、字符串生成對象等等。
其實現(xiàn)方式,概括起來,就是引入間接層元函數(shù)TypeInfoImp專門用于返回一個類型type,type里面有一個GetTypeInfo()的函數(shù)。然后TypeOf調(diào)用TypeInfoImp里的type的GetTypeInfo()最終得到TypeInfo對象。代碼如下所示。
    template<typename Ty> struct TypeInfoImp
    {
        typedef Ty type;
        
static const bool value = THasGetTypeInfoMethod<Ty>::value;
    };

    template
<typename Ty>
    
struct TypeInfoImp<const Ty> : public TypeInfoImp<Ty>
    {
        typedef typename TypeInfoImp
<Ty>::type type;
        
static const bool value = TypeInfoImp<Ty>::value;
    };
    
    template
<typename Ty>
    
const TypeInfo* TypeOf()
    {
        typedef typename TypeInfoImp
<Ty>::type TypeInfoProvider;
        
return TypeInfoProvider::GetTypeInfo();
    }
    
    template
<typename Ty>
    
const TypeInfo* TypeOf(const Ty& obj)
    {
        typedef typename IsRttiType
<Ty>::type is_rtti;    //又是間接層,對動態(tài)類型和非動態(tài)類型分別處理
        return ImpTypeOf(obj, is_rtti());
    }
    
    template
<>
    
struct TypeInfoImp < bool >
    {
        
static const bool value = true;
        typedef TypeInfoImp
<bool> type;
        
static TypeInfo* GetTypeInfo();
    };
        
    TypeInfo
* TypeInfoImp<bool>::GetTypeInfo()
    {
        
static TypeInfo* ti = CreateNativeTypeInfo<bool>("bool");
        
return ti;
    }
可能可以有簡潔的方式,比如不需要引入TypeInfoImp,但是實際最終證明TypeInfoImp的方式最具靈活性也最能節(jié)省代碼。最起碼,它在自定義的struct或者class就很方便,只要改struct內(nèi)部包含一個GetTypeInfo()的函數(shù),它就可以被納入TypeOf體系中,非常方便。對于模板類型的TypeInfoImp,就要用到哈希表了。比如,對于std::paira的類型信息,如下實現(xiàn),
    template<typename FstTy, typename SndTy>
    struct TypeInfoImp < std::pair<FstTy, SndTy> >
    {
        static const bool value = true;
        typedef TypeInfoImp < std::pair<FstTy, SndTy> > type;
        static TypeInfo* GetTypeInfo()
        {
            ParamsTypeInfo<FstTy, SndTy> args;
            return PodPair::LookupTemplateTypeInfo(args);
        }
    };
提取其類型參數(shù)的const TypeInfo*,生成數(shù)組。用此數(shù)組到PodPair的哈希表里面查找,如果哈希表中以有此類型數(shù)組參數(shù)的對象就返回,否則見創(chuàng)建一個添加一條哈希條目,然后返回。每一個泛型類型,比如vector,list,pair都有一個屬于自己的哈希表。
打完收工。原理很簡單,但是對于工業(yè)級的反射庫,要考慮很多細節(jié),比如,TypeInfo對象的內(nèi)存管理;怎么為enum類型生成一堆字符串,以支持字符串和enume值的互相轉(zhuǎn)換;生成并保存class的構(gòu)造函數(shù)和析構(gòu)函數(shù)指針;命名空間的支持;仿真C#里面的attribute;如何以最方便的方式生成成員字段或者成員函數(shù)信息等等,一句話,就是他媽的體力活。但是,回報是很豐盛的,這里的苦力活做完之后,程序的其他地方上,基本上,就沒有什么重復相似的代碼,一切的體力工作全部就可以壓在類型信息這里了。

posted on 2017-07-05 11:45 華夏之火 閱讀(1258) 評論(1)  編輯 收藏 引用 所屬分類: C++代碼自動生成

評論

# re: 完備的運行時類型信息 2017-07-06 10:47 天下

老兄,看你的博文挺有意思的啊,繼續(xù)多寫點啊!
  回復  更多評論   

導航

統(tǒng)計

常用鏈接

留言簿(6)

隨筆分類

隨筆檔案

搜索

積分與排名

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久成人在线| 欧美日韩你懂的| 亚洲成人资源| 这里只有精品在线播放| 免费精品视频| 亚洲电影专区| 一区二区三区视频在线| 99精品国产一区二区青青牛奶| 亚洲国产婷婷综合在线精品 | 国产精品成人在线| 99天天综合性| 亚洲一区二区三区欧美| 欧美一级理论片| 久久一区国产| 欧美午夜精品伦理| 合欧美一区二区三区| 亚洲国产成人精品女人久久久 | 欧美中文日韩| 老色鬼久久亚洲一区二区 | 亚洲高清资源综合久久精品| 亚洲国产一区视频| 亚洲一区高清| 免费欧美日韩国产三级电影| 欧美美女日韩| 伊人春色精品| 欧美在线日韩在线| 亚洲裸体俱乐部裸体舞表演av| 亚洲桃色在线一区| 麻豆精品视频在线| 国产欧美在线视频| 99精品热视频只有精品10| 欧美一区二区三区在线观看| 欧美激情视频一区二区三区不卡| 亚洲午夜激情| 欧美激情亚洲激情| 尤物精品在线| 亚洲男人的天堂在线aⅴ视频| 亚洲国产精彩中文乱码av在线播放| 一区二区三区视频在线观看 | 中文欧美在线视频| 猛男gaygay欧美视频| 国产日韩欧美在线看| 亚洲无限av看| 亚洲欧洲一级| 欧美大学生性色视频| 狠狠色狠狠色综合日日tαg| 亚洲欧美国产日韩天堂区| 91久久精品国产91性色tv| 久久免费的精品国产v∧| 国产农村妇女毛片精品久久麻豆| 亚洲日本va午夜在线影院| 能在线观看的日韩av| 亚洲男女自偷自拍图片另类| 欧美午夜精品久久久久久久| 中文亚洲视频在线| 99riav久久精品riav| 欧美日韩免费观看一区三区| 日韩午夜在线电影| 日韩视频精品在线观看| 美国十次了思思久久精品导航| 国产亚洲精品一区二555| 久久精品盗摄| 欧美激情久久久久| 国产一区在线观看视频| 欧美亚洲一区在线| 午夜精品久久久久99热蜜桃导演| 国产精品乱子乱xxxx| 亚洲一区二区网站| 亚洲欧美成人一区二区在线电影 | 欧美一区深夜视频| 国产丝袜一区二区| 麻豆国产va免费精品高清在线| 欧美综合国产精品久久丁香| 国内一区二区三区在线视频| 榴莲视频成人在线观看| 久久久综合香蕉尹人综合网| 亚洲国产清纯| 亚洲美女尤物影院| 国产精品激情偷乱一区二区∴| 欧美在线免费视屏| 久久综合免费视频影院| 亚洲精品少妇网址| 99日韩精品| 国外精品视频| 亚洲精品国产拍免费91在线| 国产精品黄页免费高清在线观看| 久久成人久久爱| 老司机久久99久久精品播放免费 | 久久综合激情| 欧美另类久久久品| 久久电影一区| 欧美+日本+国产+在线a∨观看| 一区二区三区 在线观看视| 亚洲天堂成人在线观看| 国产一区二区| 99国产精品国产精品久久 | 欧美日韩大片| 久久大逼视频| 欧美日韩国产精品 | 久久久久国产一区二区| 欧美激情精品久久久久久大尺度| 亚洲欧美久久| 欧美福利精品| 久久综合九九| 国产酒店精品激情| 亚洲日韩视频| 亚洲成在人线av| 午夜一级久久| 亚洲一区二区三区欧美| 久久综合狠狠| 久久久久久久999精品视频| 欧美午夜电影在线观看| 欧美大片免费| 伊人春色精品| 亚洲欧美高清| 亚洲女爱视频在线| 欧美精品v日韩精品v韩国精品v| 久久国产精品一区二区| 欧美视频观看一区| 亚洲一二三区视频在线观看| 欧美高清免费| 国产最新精品精品你懂的| 日韩视频一区二区三区在线播放| 韩日精品在线| 销魂美女一区二区三区视频在线| 亚洲视频在线二区| 欧美日韩免费高清一区色橹橹| 欧美激情1区| 亚洲国产日本| 老司机久久99久久精品播放免费| 久久精品视频在线| 国产亚洲欧美另类中文| 亚洲在线视频网站| 欧美一区二区精品久久911| 国产精品久久久一区二区三区| 亚洲欧洲久久| 一区二区三区欧美亚洲| 欧美精品在线观看一区二区| 欧美福利在线观看| 亚洲欧洲一区二区天堂久久| 男女激情久久| 亚洲欧洲视频| 亚洲午夜精品视频| 国产精品视频1区| 欧美一区三区二区在线观看| 欧美一区中文字幕| 国产区亚洲区欧美区| 欧美在线视频网站| 欧美成人激情视频| 亚洲精品综合久久中文字幕| 欧美激情第二页| 一本色道久久综合狠狠躁篇的优点| 亚洲图中文字幕| 国产日韩在线播放| 久久婷婷国产综合尤物精品| 久久中文字幕一区| 亚洲日本成人女熟在线观看| 欧美精品一区三区| 一区二区三区久久| 久久亚洲精品视频| 亚洲国产一区视频| 欧美三级乱码| 久久久久久亚洲精品中文字幕| 欧美丰满高潮xxxx喷水动漫| 夜夜嗨av色综合久久久综合网| 欧美视频在线观看免费网址| 亚洲综合色自拍一区| 欧美成人性生活| 亚洲一区影音先锋| 国产一区导航| 欧美日韩国产三区| 久久狠狠一本精品综合网| 亚洲国产精品成人一区二区 | 91久久久在线| 亚洲欧美日韩国产中文| 国产视频一区免费看| 欧美成人免费在线观看| 亚洲欧美日本精品| 亚洲精品久久久久久久久| 欧美一区三区三区高中清蜜桃| 在线观看一区二区视频| 欧美午夜精品久久久久久孕妇| 久久久国产精彩视频美女艺术照福利| 欧美国内亚洲| 久久男人资源视频| 亚洲欧美久久久| 在线看片日韩| 欧美不卡视频| 亚洲精品一区二区三区在线观看| 国产精品高潮视频| 久久亚洲一区二区三区四区| 亚洲黄一区二区| 另类国产ts人妖高潮视频| 亚洲欧美美女| 99爱精品视频| 亚洲三级电影全部在线观看高清| 久久综合久久综合久久| 亚洲欧美另类国产| 91久久国产自产拍夜夜嗨| 国产一区二区三区四区|