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

隨筆-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>
            国产精品久久一区二区三区| 久热精品视频在线观看| 国产精品chinese| 欧美成人自拍| 久久一综合视频| 久久精品国产亚洲5555| 久久xxxx精品视频| 鲁鲁狠狠狠7777一区二区| 老司机午夜精品视频在线观看| 老司机67194精品线观看| 欧美国产欧美亚州国产日韩mv天天看完整 | 亚洲精品在线免费| 亚洲茄子视频| 亚洲精品偷拍| 亚洲欧美久久久久一区二区三区| 欧美一级二级三级蜜桃| 美女视频一区免费观看| 欧美三日本三级少妇三2023 | 91久久综合| 在线视频日韩| 久久九九久久九九| 欧美日韩国产高清| 国产美女精品视频免费观看| 在线不卡a资源高清| 正在播放欧美一区| 久久精品道一区二区三区| 欧美电影免费观看高清| 亚洲天堂偷拍| 男女激情久久| 国产日韩一区二区| 在线视频欧美一区| 久久综合给合久久狠狠色| 亚洲精品激情| 久久精品中文字幕一区| 欧美日韩一级视频| 亚洲激情午夜| 久久夜色精品国产噜噜av| 9色精品在线| 欧美黄网免费在线观看| 国语自产精品视频在线看| 久久男人资源视频| 一本大道久久精品懂色aⅴ| 国产精品99久久久久久久久久久久 | 欧美日产一区二区三区在线观看 | 亚洲七七久久综合桃花剧情介绍| 亚洲欧美卡通另类91av| 欧美日韩成人网| 亚洲春色另类小说| 久久久7777| 亚洲一区三区视频在线观看| 欧美成人精品在线播放| 国内精品一区二区三区| 欧美一区免费视频| 这里只有精品丝袜| 欧美日韩亚洲网| 一本大道久久a久久精品综合| 欧美成人在线网站| 狼人天天伊人久久| 亚洲国产欧美另类丝袜| 久久久久综合网| 香蕉久久a毛片| 国产日韩精品电影| 欧美在线播放一区| 性做久久久久久免费观看欧美| 国产精品丝袜久久久久久app| 亚洲午夜女主播在线直播| 亚洲日本中文字幕区 | 国产婷婷成人久久av免费高清| 一区二区久久久久久| 亚洲高清不卡| 欧美精品自拍| 亚洲综合999| 性欧美xxxx大乳国产app| 国产麻豆成人精品| 久久久久一区二区三区四区| 久久激情五月丁香伊人| 在线看片成人| 亚洲国产精品一区二区www| 欧美+日本+国产+在线a∨观看| 亚洲激情在线| 一区二区三区久久精品| 国产日韩欧美二区| 欧美国产在线观看| 欧美午夜精品一区| 久久久久久伊人| 欧美大片一区二区三区| 亚洲一区二区三区高清| 欧美一区成人| 日韩午夜电影av| 欧美一级日韩一级| 欧美亚洲一区二区在线观看| 在线播放日韩欧美| 99精品视频免费在线观看| 欧美日韩中文字幕精品| 午夜亚洲精品| 另类尿喷潮videofree| 亚洲天堂男人| 久久精品成人| 亚洲一区在线观看视频 | 免费观看日韩av| 亚洲视频第一页| 久久国产精品亚洲77777| 亚洲日本无吗高清不卡| 亚洲一区二区三区国产| 亚洲国产婷婷香蕉久久久久久| 一区二区三区精品在线| 亚洲级视频在线观看免费1级| 亚洲一区日韩在线| 亚洲精品欧美| 久久国产精品网站| 亚洲欧美激情诱惑| 男人的天堂成人在线| 久久国产精品亚洲77777| 欧美日本精品在线| 欧美aaaaaaaa牛牛影院| 国产精品中文字幕在线观看| 亚洲人成网站999久久久综合| 国产视频在线观看一区| 亚洲精品乱码| 91久久在线观看| 久久久久9999亚洲精品| 亚洲欧美日韩视频二区| 欧美好骚综合网| 欧美成年人视频网站欧美| 国产一区二区日韩精品| 亚洲色诱最新| 亚洲一区亚洲二区| 国产精品v欧美精品∨日韩| 亚洲国产综合91精品麻豆| 狠狠久久亚洲欧美专区| 午夜亚洲一区| 性欧美精品高清| 国产精品mm| 亚洲特级毛片| 亚洲一区观看| 国产精品久久九九| 亚洲一级免费视频| 翔田千里一区二区| 国产精品视频免费在线观看| 99国产精品国产精品久久| 99视频有精品| 欧美日韩理论| 一本久久综合| 午夜激情亚洲| 国产婷婷色一区二区三区在线| 亚洲一区二区三区四区在线观看 | 亚洲人成人99网站| 99精品国产在热久久| 欧美精品成人| 一区二区三区高清不卡| 午夜精品一区二区三区在线视| 国产精品v欧美精品v日韩精品 | 欧美一级淫片aaaaaaa视频| 99视频精品在线| 亚洲天堂网在线观看| 国产精品入口66mio| 午夜亚洲性色视频| 美女主播一区| 在线视频日韩| 国产一区观看| 欧美激情亚洲国产| 在线亚洲一区| 久久精品国产第一区二区三区最新章节 | 久久亚洲国产成人| 亚洲国产视频一区| 欧美天天视频| 午夜精品一区二区三区在线视| 麻豆成人综合网| 99在线精品视频| 国产精品自拍网站| 免费在线日韩av| 亚洲欧美亚洲| 最新精品在线| 久久gogo国模裸体人体| 亚洲电影有码| 国产精品美女主播| 蜜桃av噜噜一区| 亚洲欧美成人综合| 亚洲第一中文字幕| 欧美一级视频| 99热免费精品| 一区在线免费观看| 国产精品美女久久久久久免费 | 久久久激情视频| 亚洲精品看片| 牛人盗摄一区二区三区视频| 亚洲免费影视第一页| 1024精品一区二区三区| 国产精品第一区| 欧美大色视频| 久久久久久久综合| 亚洲尤物精选| 99精品视频一区| 亚洲韩日在线| 久久视频一区二区| 欧美一区三区三区高中清蜜桃| 日韩五码在线| 亚洲精品乱码久久久久久黑人| 国产欧美一区在线| 国产精品v欧美精品v日韩 |