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

隨筆-341  評論-2670  文章-0  trackbacks-0
    所謂的反射當然不是自動化的,而是需要自己打標記的。下面會展示兩份文件,告訴大家我這個做了一半的反射是怎么工作的。寫這個東西的主要目的是,將來可以實現序列化,譬如說序列化到流,或者序列化到XML文件,或者做其他的事情等等(譬如說使用類名創建對象并進行修改)。

    首先是運行結果。下面的結果是console application窗口上打印的。因為太長所以沒截圖。我創建了三個對象,然后使用反射將他們的內容打印了出來:
  1 Cat {
  2   BodyLength = 50
  3   TailLength = 30
  4   FingerCount = 18
  5   Age = 10
  6   Weight = 100
  7 }
  8 Fish {
  9   MaxDepth = 3000.0
 10   Length = 25
 11   Age = 20
 12   Weight = 200
 13 }
 14 Bird {
 15   CanFly = true
 16   Name = Jack
 17   Age = 30
 18   Weight = 300
 19 }
 20 Human {
 21   Name = 囧Smith
 22   MainPat = Cat {
 23     BodyLength = 40
 24     TailLength = 20
 25     FingerCount = 18
 26     Age = 5
 27     Weight = 150
 28   }
 29   MainTransportation = Bird {
 30     CanFly = true
 31     Name = Red Dragon
 32     Age = 3000
 33     Weight = 300
 34   }
 35   OtherPats = VL_AutoPtr<Animal>[4] {
 36     item[0= Cat {
 37       BodyLength = 50
 38       TailLength = 30
 39       FingerCount = 18
 40       Age = 10
 41       Weight = 100
 42     }
 43     item[1= Fish {
 44       MaxDepth = 3000.0
 45       Length = 25
 46       Age = 20
 47       Weight = 200
 48     }
 49     item[2= Bird {
 50       CanFly = true
 51       Name = Jack
 52       Age = 30
 53       Weight = 300
 54     }
 55     item[3= <NULL>
 56   }
 57   OtherTranspotations = Bird[3] {
 58     item[0= Bird {
 59       CanFly = true
 60       Name = Blue Dragon 1
 61       Age = 3000
 62       Weight = 300
 63     }
 64     item[1= Bird {
 65       CanFly = true
 66       Name = Blue Dragon 2
 67       Age = 3100
 68       Weight = 300
 69     }
 70     item[2= Bird {
 71       CanFly = true
 72       Name = Blue Dragon 3
 73       Age = 3200
 74       Weight = 300
 75     }
 76   }
 77   OtherPatsList = VL_List<VL_AutoPtr<Animal> , false> {
 78     item[0= Cat {
 79       BodyLength = 50
 80       TailLength = 30
 81       FingerCount = 18
 82       Age = 10
 83       Weight = 100
 84     }
 85     item[1= Fish {
 86       MaxDepth = 3000.0
 87       Length = 25
 88       Age = 20
 89       Weight = 200
 90     }
 91     item[2= Bird {
 92       CanFly = true
 93       Name = Jack
 94       Age = 30
 95       Weight = 300
 96     }
 97   }
 98   OtherTranspotationsList = VL_List<Bird , false> {
 99     item[0= Bird {
100       CanFly = true
101       Name = Green Dragon 1
102       Age = 3000
103       Weight = 300
104     }
105     item[1= Bird {
106       CanFly = true
107       Name = Green Dragon 2
108       Age = 3010
109       Weight = 300
110     }
111     item[2= Bird {
112       CanFly = true
113       Name = Green Dragon 3
114       Age = 3020
115       Weight = 300
116     }
117   }
118   FingerCount = 20
119   Age = 16
120   Weight = 2000
121 }
122 

    下面是main函數的代碼。這里聲明了幾個類,然后標記了一下感興趣的成員:
  1 #include "..\..\..\..\VL++\Library\Platform\VL_Console.h"
  2 #include "..\..\..\..\VL++\Library\Data\Inspector\VL_ObjectInspector.h"
  3 #include "..\..\..\..\VL++\Library\Data\Inspector\VL_ObjectStrconv.h"
  4 
  5 using namespace vl;
  6 using namespace vl::platform;
  7 using namespace vl::inspector;
  8 
  9 class Animal : public VL_Base
 10 {
 11 public:
 12     VInt                Age;
 13     VInt                Weight;
 14 };
 15 
 16 class Mammalian : public Animal
 17 {
 18 public:
 19     VInt                FingerCount;
 20 };
 21 
 22 class Cat : public Mammalian
 23 {
 24 public:
 25     VInt                BodyLength;
 26     VInt                TailLength;
 27 
 28     Cat()
 29     {
 30         Age=10;
 31         Weight=100;
 32         FingerCount=18;
 33         BodyLength=50;
 34         TailLength=30;
 35     }
 36 };
 37 
 38 class Fish : public Animal
 39 {
 40 public:
 41     VDouble                MaxDepth;
 42     VInt                Length;
 43 
 44     Fish()
 45     {
 46         Age=20;
 47         Weight=200;
 48         MaxDepth=3000;
 49         Length=25;
 50     }
 51 };
 52 
 53 class Bird : public Animal
 54 {
 55 public:
 56     VBool                CanFly;
 57     VUnicodeString        Name;
 58 
 59     Bird()
 60     {
 61         Age=30;
 62         Weight=300;
 63         CanFly=true;
 64         Name=L"Jack";
 65     }
 66 };
 67 
 68 class Human : public Mammalian
 69 {
 70 public:
 71     VUnicodeString                                    Name;
 72     VL_AutoPtr<Animal>                                MainPat;
 73     Bird                                            MainTransportation;
 74     VL_AutoPtr<Animal>                                OtherPats[4];
 75     Bird                                            OtherTranspotations[3];
 76     VL_List<VL_AutoPtr<Animal> , false , Animal*>    OtherPatsList;
 77     VL_List<Bird , false>                            OtherTranspotationsList;
 78 
 79     Human()
 80     {
 81         Age=16;
 82         Weight=2000;
 83         FingerCount=20;
 84         Name=L"囧Smith";
 85 
 86         Cat* cat=new Cat;
 87         cat->Age=5;
 88         cat->Weight=150;
 89         cat->BodyLength=40;
 90         cat->TailLength=20;
 91         MainPat=cat;
 92 
 93         MainTransportation.Name=L"Red Dragon";
 94         MainTransportation.Age=3000;
 95 
 96         OtherPats[0]=new Cat;
 97         OtherPats[1]=new Fish;
 98         OtherPats[2]=new Bird;
 99 
100         for(VInt i=0;i<3;i++)
101         {
102             OtherTranspotations[i].Name=L"Blue Dragon "+VUnicodeString(i+1);
103             OtherTranspotations[i].Age=3000+i*100;
104         }
105 
106         OtherPatsList.Add(new Cat);
107         OtherPatsList.Add(new Fish);
108         OtherPatsList.Add(new Bird);
109 
110         for(VInt i=0;i<3;i++)
111         {
112             OtherTranspotationsList.Add(Bird());
113             OtherTranspotationsList[i].Name=L"Green Dragon "+VUnicodeString(i+1);
114             OtherTranspotationsList[i].Age=3000+i*10;
115         }
116     }
117 };
118 
119 VL_BEGIN_INSPECTOR_DECLARATION
120 
121     VL_BEGIN_BASE_CLASS(Animal)
122         VL_ADD_CLASS_MEMBER(Animal,Age)
123         VL_ADD_CLASS_MEMBER(Animal,Weight)
124     VL_END_CLASS(Animal)
125 
126     VL_BEGIN_SUB_CLASS(Mammalian,Animal)
127         VL_ADD_CLASS_MEMBER(Mammalian,FingerCount)
128     VL_END_CLASS(Mammalian)
129 
130     VL_BEGIN_SUB_CLASS(Cat,Mammalian)
131         VL_ADD_CLASS_MEMBER(Cat,BodyLength)
132         VL_ADD_CLASS_MEMBER(Cat,TailLength)
133     VL_END_CLASS(Cat)
134 
135     VL_BEGIN_SUB_CLASS(Fish,Animal)
136         VL_ADD_CLASS_MEMBER(Fish,MaxDepth)
137         VL_ADD_CLASS_MEMBER(Fish,Length)
138     VL_END_CLASS(Fish)
139 
140     VL_BEGIN_SUB_CLASS(Bird,Animal)
141         VL_ADD_CLASS_MEMBER(Bird,CanFly)
142         VL_ADD_CLASS_MEMBER(Bird,Name)
143     VL_END_CLASS(Bird)
144 
145     VL_BEGIN_SUB_CLASS(Human,Mammalian)
146         VL_ADD_CLASS_MEMBER(Human,Name)
147         VL_ADD_CLASS_MEMBER(Human,MainPat)
148         VL_ADD_CLASS_MEMBER(Human,MainTransportation)
149         VL_ADD_CLASS_MEMBER(Human,OtherPats)
150         VL_ADD_CLASS_MEMBER(Human,OtherTranspotations)
151         VL_ADD_CLASS_MEMBER(Human,OtherPatsList)
152         VL_ADD_CLASS_MEMBER(Human,OtherTranspotationsList)
153     VL_END_CLASS(Human)
154 
155     VL_BEGIN_INSPECTOR_MANAGER(AnimalManager)
156         VL_BIND_INSPECTOR(Animal)
157         VL_BIND_INSPECTOR(Mammalian)
158         VL_BIND_INSPECTOR(Cat)
159         VL_BIND_INSPECTOR(Fish)
160         VL_BIND_INSPECTOR(Bird)
161         VL_BIND_INSPECTOR(Human)
162     VL_END_INSPECTOR_MANAGER
163 
164 VL_END_INSPECTOR_DECLARATION
165 
166 void PrintAnimal(VL_InspectorManager::Ptr Manager , Animal* aAnimal)
167 {
168     VL_InspectorConverterManager Converter;
169     Converter.AddNormalConverter(new VL_InspectorReader);
170 
171     VL_ObjectInspector::Ptr Inspector=Manager->GetInspector(VL_InspectorSelector<Animal>::GetID());
172     GetConsole()->WriteLine(Converter.FindToStringConverter(Inspector)->ConvertToString(Inspector,aAnimal));
173 }
174 
175 void vlmain()
176 {
177     GetConsole()->SetTitle(L"Vczh Library++ 2.0 Type Information Test");
178     GetConsole()->SetTestMemoryLeaks(true);
179     GetConsole()->SetPauseOnExit(true);
180 
181     VL_InspectorManager::Ptr Manager=VL_GET_INSPECTOR_MANAGER(AnimalManager);
182 
183     Cat cat;
184     Fish fish;
185     Bird bird;
186     Human human;
187     PrintAnimal(Manager,&cat);
188     PrintAnimal(Manager,&fish);
189     PrintAnimal(Manager,&bird);
190     PrintAnimal(Manager,&human);
191 }

    最后是一個ConvertToString的函數,來展示如何讀取數據的:
 1         VUnicodeString VL_InspectorReader::ConvertToString(VL_ObjectInspector::Ptr Inspector , VPointer Data , VUnicodeString Prefix)
 2         {
 3             if(Data==0)
 4             {
 5                 return L"<NULL>";
 6             }
 7             else if(VL_AutoPtr<VL_StructInspector> Struct=Inspector)
 8             {
 9                 Struct=Struct->GetRealObject(Data);
10                 VUnicodeString String=Struct->GetID()+L" {\r\n";
11                 while(Struct)
12                 {
13                     for(VInt i=0;i<Struct->GetMemberCount();i++)
14                     {
15                         VL_MemberInspector::Ptr Member=Struct->GetMember(i);
16                         String+=Prefix+L"  "+Member->GetMemberName()+L" = ";
17                         String+=ConvertToString(Member->GetMemberInspector(),Member->GetMember(Data),Prefix+L"  ")+L"\r\n";
18                     }
19                     Data=Struct->GetBase(Data);
20                     Struct=Struct->GetBaseInspector();
21                 }
22                 String+=Prefix+L"}";
23                 return String;
24             }
25             else if(VL_AutoPtr<VL_CollectionInspector> Collection=Inspector)
26             {
27                 VUnicodeString String=Collection->GetID()+L" {\r\n";
28                 for(VInt i=0;i<Collection->GetMemberCount(Data);i++)
29                 {
30                     VL_MemberInspector::Ptr Member=Collection->GetMember(i,Data);
31                     String+=Prefix+L"  item["+VUnicodeString(i)+L"] = ";
32                     String+=ConvertToString(Member->GetMemberInspector(),Member->GetMember(Data),Prefix+L"  ")+L"\r\n";
33                 }
34                 String+=Prefix+L"}";
35                 return String;
36             }
37             else
38             {
39                 VL_InspectorConverter::Ptr Converter=FManager->FindToStringConverter(Inspector);
40                 if(Converter)
41                 {
42                     return Converter->ConvertToString(Inspector,Data);
43                 }
44                 else
45                 {
46                     return L"<UNKNOWN>";
47                 }
48             }
49         }
posted on 2009-06-25 06:48 陳梓瀚(vczh) 閱讀(3607) 評論(4)  編輯 收藏 引用 所屬分類: C++

評論:
# re: 重寫了C++的類似反射的工具 2009-06-26 12:38 | XXOOXX
挺好用的東西。
我認為原理就是記住成員的類型和在類中的位置,并對應他們的名字。
然後可以通過名字取到某個類對象的成員。

我是用 &((clsss*)0)->mem; 這樣取成員位置。

  回復  更多評論
  
# re: 重寫了C++的類似反射的工具 2009-06-27 07:27 | 陳梓瀚(vczh)
@XXOOXX
是的。  回復  更多評論
  
# re: 重寫了C++的類似反射的工具 2009-07-01 22:49 | Gohan
宏里博主應該也用了樓上所說的“&((clsss*)0)->mem”技法了吧?  回復  更多評論
  
# re: 重寫了C++的類似反射的工具 2009-07-03 01:15 | 陳梓瀚(vczh)
我其實用的是&class::mem。C++有一些新東西。  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美与黑人午夜性猛交久久久| 欧美国产免费| 国产日韩欧美自拍| 国产精品成人一区二区三区夜夜夜 | 一区二区三区精品国产| 裸体一区二区三区| 亚洲日本精品国产第一区| 国产区精品视频| 国产伦精品一区二区三区高清版| 欧美精品麻豆| 国产精品久久久久久影视| 欧美日韩在线看| 国产丝袜美腿一区二区三区| 欧美性淫爽ww久久久久无| 国产精品一二三四| 悠悠资源网亚洲青| 99热在这里有精品免费| 亚洲影院色无极综合| 亚洲午夜激情| 久久久91精品国产| 91久久亚洲| 亚洲高清视频一区二区| 一区二区三区欧美亚洲| 久久精品中文字幕免费mv| 欧美激情精品久久久久久黑人| 国产精品扒开腿做爽爽爽软件| 国内精品久久久久久| 午夜精品福利电影| 一区二区欧美视频| 欧美在线免费视频| 欧美国产日本高清在线| 国产精品网站在线播放| 亚洲国产99精品国自产| 亚洲欧美日本日韩| 欧美电影在线观看完整版| 制服丝袜激情欧洲亚洲| 蜜桃久久精品乱码一区二区| 国产精品久久久久久久久搜平片| 在线观看日韩专区| 亚洲一区欧美| 亚洲高清视频在线| 久久久91精品| 国产欧美日韩亚洲一区二区三区 | 亚洲国产精品国自产拍av秋霞| 亚洲小说欧美另类社区| 欧美黑人一区二区三区| 亚久久调教视频| 欧美日韩一区二区在线| 亚洲精品影视在线观看| 久久久久久久性| 一区二区三区四区国产精品| 欧美电影在线播放| 亚洲国产精品一区二区第四页av| 性欧美xxxx视频在线观看| 99国产一区| 欧美激情自拍| 激情欧美丁香| 久久久999精品| 亚洲欧美变态国产另类| 欧美午夜不卡在线观看免费| 亚洲麻豆av| 亚洲国产精品va| 欧美18av| 亚洲人在线视频| 亚洲国产精品久久人人爱蜜臀| 久久久久久9999| 在线观看一区二区视频| 久久亚洲综合网| 久久久久久久久一区二区| 激情五月婷婷综合| 欧美91视频| 欧美国产日本高清在线| 中文有码久久| 国产日本精品| 美女国产一区| 美日韩精品视频| 一本一道久久综合狠狠老精东影业| 亚洲黄色视屏| 欧美三区在线视频| 亚洲欧美综合一区| 久久精品成人一区二区三区蜜臀| 在线观看日韩www视频免费 | 久热re这里精品视频在线6| 美女黄网久久| 亚洲九九爱视频| 99视频一区二区| 国产九色精品成人porny| 久久精品国产精品亚洲综合| 久久人人超碰| 一级日韩一区在线观看| 这里只有精品视频在线| 好看的日韩视频| 亚洲人成网站999久久久综合| 欧美日韩国产三区| 欧美在线免费观看亚洲| 久久综合狠狠综合久久综青草| 99re亚洲国产精品| 欧美在线关看| 在线一区二区日韩| 久久精品免费看| 亚洲一区二区三| 久久一区二区精品| 亚洲欧美日韩视频一区| 久久久久久网站| 宅男噜噜噜66国产日韩在线观看| 亚洲欧美中文在线视频| 日韩午夜电影| 久久人人爽国产| 亚洲欧美日韩另类精品一区二区三区| 久久精品国产免费看久久精品 | 久久视频在线视频| 欧美特黄一级大片| 欧美国产91| 黑人极品videos精品欧美裸| 亚洲精品少妇30p| 精品不卡视频| 欧美伊人影院| 亚洲视频在线观看视频| 欧美成年人视频网站| 久久网站热最新地址| 欧美香蕉大胸在线视频观看| 亚洲高清在线视频| 激情欧美一区二区| 一区二区毛片| 欧美一级专区免费大片| 亚洲午夜激情网站| 欧美国内亚洲| 亚洲国产精品成人精品| 悠悠资源网亚洲青| 久久精选视频| 久久综合给合| 黄色亚洲精品| 久久99伊人| 久久精品青青大伊人av| 国产欧美日本一区二区三区| 亚洲四色影视在线观看| 亚洲性视频网站| 欧美视频一区二| 一区二区日韩| 亚洲欧洲av一区二区三区久久| 国产精品九色蝌蚪自拍| 中文在线资源观看网站视频免费不卡| 99成人在线| 欧美日韩一级视频| 一本一道久久综合狠狠老精东影业 | 午夜精品视频在线观看| 农村妇女精品| 国产农村妇女毛片精品久久莱园子 | 亚洲欧美成人网| 欧美日韩中文在线| 一区二区三区国产在线| 亚洲一区二区成人在线观看| 欧美日韩中文字幕日韩欧美| 亚洲免费av观看| 亚洲男人第一网站| 国产性做久久久久久| 久久久国产午夜精品| 欧美大片免费观看在线观看网站推荐 | 免费成人高清视频| 亚洲精品国产精品久久清纯直播 | 久久久久88色偷偷免费| 一区二区三区在线视频播放| 久久字幕精品一区| 亚洲国产精品va| 亚洲欧美另类中文字幕| 国产亚洲精品aa午夜观看| 久久精品电影| 亚洲黄一区二区三区| 亚洲女人av| 精品91久久久久| 久久精品视频免费| 亚洲欧洲一区二区三区在线观看| 欧美日韩国产小视频| 欧美一级在线亚洲天堂| 亚洲第一福利社区| 亚洲欧美激情视频| 亚洲成色精品| 国产精品久久一卡二卡| 久久久亚洲午夜电影| 一本色道久久综合精品竹菊 | 亚洲视频在线观看视频| 久久久精品999| 一区二区三区蜜桃网| 国产日韩欧美一区在线| 欧美 日韩 国产 一区| 亚洲欧美日韩中文视频| 亚洲国内高清视频| 久久久久久**毛片大全| 99精品国产热久久91蜜凸| 国产亚洲成年网址在线观看| 欧美日韩精品高清| 久久午夜国产精品| 亚洲新中文字幕| 亚洲日本欧美日韩高观看| 裸体女人亚洲精品一区| 欧美一区二视频在线免费观看| 亚洲日本欧美天堂| 国内偷自视频区视频综合| 国产精品va在线| 欧美韩日亚洲|