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

隨筆-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>
            欧美一区亚洲一区| 99re8这里有精品热视频免费| 伊人激情综合| 欧美激情在线狂野欧美精品| 免费黄网站欧美| 亚洲自拍偷拍麻豆| 久久精品国产99| 亚洲女同性videos| 欧美v国产在线一区二区三区| 一区二区日韩精品| 久久精视频免费在线久久完整在线看| 91久久精品美女高潮| 亚洲性xxxx| 午夜激情综合网| 欧美日韩国产综合新一区| 亚洲国产福利在线| 精品88久久久久88久久久| 先锋a资源在线看亚洲| 亚洲一区在线直播| 国产精品视频自拍| 亚洲福利视频网| 久久免费高清视频| 噜噜噜噜噜久久久久久91 | 国产亚洲va综合人人澡精品| 亚洲精品免费在线播放| 亚洲欧洲另类国产综合| 米奇777在线欧美播放| 欧美国产精品v| 一区二区高清视频| 国产精品二区二区三区| 亚洲欧美在线磁力| 欧美wwwwww| 国产精品99久久99久久久二8 | 久久精品国产2020观看福利| 欧美一级久久| 亚洲欧洲一区二区在线观看| 欧美国产精品劲爆| 欧美专区18| 99这里只有久久精品视频| 亚洲欧美日韩中文播放| 影音先锋欧美精品| 国产精品日韩二区| 亚洲一区二区三区视频| 久久先锋资源| 亚洲国产精品福利| 国产日产亚洲精品| 欧美日韩精品综合| 欧美日韩高清一区| 欧美+亚洲+精品+三区| 999在线观看精品免费不卡网站| 欧美二区在线看| 久久青青草综合| 久久久国产精品一区二区三区| 宅男噜噜噜66国产日韩在线观看| 久久综合网络一区二区| 久久久九九九九| 免费观看一区| 亚洲国产精品99久久久久久久久| 久久精品一区二区| 欧美激情精品久久久久久久变态| 久久久久久久久一区二区| 亚洲女ⅴideoshd黑人| 亚洲一区三区视频在线观看| 一区二区三区四区国产| 一区二区久久久久| 亚洲欧美视频在线| 嫩草国产精品入口| 亚洲裸体俱乐部裸体舞表演av| 亚洲欧洲一区二区三区| 日韩亚洲欧美一区二区三区| 亚洲麻豆一区| 亚洲毛片av在线| 欧美在线综合| 欧美成年人在线观看| 欧美日韩一区二区三区在线看| 亚洲一区一卡| 久久夜色精品国产欧美乱极品| 久久久天天操| 国产精品久久久久久久浪潮网站| 国产精品一区二区三区观看| 在线视频国内自拍亚洲视频| 亚洲精品中文字幕有码专区| 欧美日韩精品一区二区| 国产嫩草影院久久久久| 亚洲人成毛片在线播放| 久久国产欧美精品| 亚洲日韩中文字幕在线播放| 亚洲男女自偷自拍| 欧美日韩亚洲系列| 日韩一级免费| 欧美电影免费| 麻豆成人综合网| 国产一区二区三区精品欧美日韩一区二区三区 | 国产日本欧美一区二区三区| 日韩亚洲欧美一区| 日韩一区二区精品葵司在线| 免费久久久一本精品久久区| 国内精品久久久久久久97牛牛| 欧美有码在线观看视频| 激情久久久久| 欧美性片在线观看| 亚洲你懂的在线视频| 一区二区激情| 精品不卡一区| 欧美高清一区| 欧美.www| 亚洲精品日韩综合观看成人91| 亚洲一区二区三区精品视频| 免费成人在线视频网站| 午夜免费日韩视频| 欧美成人免费小视频| 狠狠色狠狠色综合日日91app| 亚洲欧美日韩综合aⅴ视频| 一区在线观看| 欧美黑人国产人伦爽爽爽| 欧美影片第一页| 国内外成人在线| 欧美成人按摩| 蜜桃av综合| 欧美片第一页| 久久精品99久久香蕉国产色戒| 亚洲午夜国产成人av电影男同| 欧美日韩中文在线观看| 久久精品国产69国产精品亚洲| 亚洲精品在线电影| 久久网站热最新地址| 欧美精品高清视频| 久久久综合精品| 欧美日韩美女在线| 欧美成人免费在线视频| 欧美视频精品在线观看| 久久亚洲综合网| 欧美午夜精品久久久久久浪潮| 99热在这里有精品免费| 亚洲欧美国产一区二区三区| 亚洲国产日韩欧美在线99| 亚洲欧美卡通另类91av| 亚洲国产成人午夜在线一区| 亚洲无玛一区| 亚洲国产影院| 欧美一区精品| 欧美aaa级| 亚洲人成网站影音先锋播放| 亚洲女ⅴideoshd黑人| 亚洲欧美日韩一区在线观看| 欧美激情亚洲| 久久在线精品| 亚洲国产精品成人精品| 18成人免费观看视频| 久热国产精品| 欧美激情二区三区| 国产午夜亚洲精品不卡| 亚洲丁香婷深爱综合| 国产精品hd| 久久久999成人| 国产精品免费福利| 日韩午夜激情| 亚洲国产精品精华液网站| 久久天堂精品| 欧美不卡视频一区发布| 精品999在线播放| 亚洲一区网站| 欧美gay视频| 日韩亚洲欧美在线观看| 欧美日韩精品系列| 亚洲免费中文字幕| 亚洲国产精品尤物yw在线观看| 亚洲国产精品成人综合色在线婷婷| 欧美成人三级在线| 久久九九久精品国产免费直播| 日韩亚洲一区在线播放| 亚洲国产天堂网精品网站| 亚洲久久在线| 国产欧美日韩精品丝袜高跟鞋| 久久久久久夜| 99综合电影在线视频| 老鸭窝亚洲一区二区三区| 亚洲美女视频网| 亚洲国产精品日韩| 国产美女一区二区| 国产视频在线一区二区| 国产欧美一区视频| 激情久久五月| 亚洲在线国产日韩欧美| 欧美伊久线香蕉线新在线| 亚洲综合国产精品| 亚洲乱码国产乱码精品精可以看 | 一区二区三区福利| 在线观看欧美日韩| 亚洲精品在线免费| 亚洲日本电影| 亚洲欧美在线一区二区| 亚洲综合第一| 久久久精品国产一区二区三区| 久久国产乱子精品免费女| 亚洲免费久久| 欧美日韩一级黄| 欧美专区在线| 亚洲国产福利在线| 亚洲一区二区三区影院|