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

隨筆-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>
            亚洲第一在线视频| 狠狠色丁香婷婷综合影院| 亚洲国产成人91精品| 麻豆精品一区二区综合av| 久久亚洲不卡| 免费看亚洲片| 在线成人性视频| 亚洲欧美日本另类| 欧美伦理91| 日韩系列在线| 欧美华人在线视频| 久久久精品动漫| 亚洲毛片av在线| 亚洲日本欧美天堂| 怡红院精品视频在线观看极品| 亚洲人成亚洲人成在线观看| 亚洲国产精品一区在线观看不卡| 亚洲欧美日韩国产另类专区| 99热精品在线| 欧美亚洲综合久久| 老色鬼精品视频在线观看播放| 日韩视频在线一区| 一区二区国产日产| 久久九九久精品国产免费直播| 欧美刺激性大交免费视频| 亚洲国产精品一区二区第一页 | 久久综合狠狠综合久久综合88| 欧美a级片网站| av成人免费在线观看| 欧美在线观看一二区| 欧美女人交a| 影视先锋久久| 欧美一级欧美一级在线播放| 亚洲大胆美女视频| 欧美一区永久视频免费观看| 欧美区国产区| 亚洲国产精品一区二区尤物区 | 亚洲免费视频观看| 美女视频黄免费的久久| 国产日韩精品一区二区三区 | 亚洲精品一线二线三线无人区| 久久久久久亚洲综合影院红桃| 亚洲午夜精品网| 美女主播一区| 亚洲主播在线观看| 欧美日韩综合在线| 亚洲精品视频在线看| 亚洲第一在线综合在线| 久久国产综合精品| 欧美区一区二| 亚洲人成人一区二区三区| 久久gogo国模啪啪人体图| 亚洲国产成人在线| 乱人伦精品视频在线观看| 国产一区二区剧情av在线| 羞羞色国产精品| 亚洲图片欧洲图片av| 欧美日韩免费一区二区三区视频 | 久久久久久综合网天天| 国产精品一区二区久久久久| 亚洲私人影院在线观看| 亚洲电影免费观看高清完整版在线观看 | 欧美二区乱c少妇| 亚洲欧美三级在线| 国产精品一区一区| 久久黄金**| 欧美一级久久久| 国产农村妇女毛片精品久久莱园子| 国产精品一二三四| 亚洲一区免费| 亚洲欧美激情视频在线观看一区二区三区| 一区二区三区欧美在线观看| 欧美精品少妇一区二区三区| 日韩亚洲一区在线播放| 夜夜嗨av色综合久久久综合网| 亚洲免费在线播放| 国产日韩欧美一区二区三区四区| 狠狠色综合一区二区| 久久天天躁狠狠躁夜夜爽蜜月| 欧美福利视频在线| 欧美国产一区视频在线观看| 夜夜躁日日躁狠狠久久88av| 亚洲视频一区在线| 国产一区二区高清视频| 另类人畜视频在线| 欧美日本一区二区三区| 在线视频欧美一区| 午夜久久久久久久久久一区二区| 欧美xxx成人| 一本大道av伊人久久综合| 一本色道久久综合亚洲精品婷婷| 久久国产免费看| 亚洲成色最大综合在线| 日韩午夜免费视频| 国产农村妇女精品一二区| 麻豆成人综合网| 欧美日韩卡一卡二| 久久国产主播| 亚洲欧洲三级电影| 欧美性猛交xxxx乱大交退制版 | 欧美精品一区二区三区蜜桃| 亚洲视频二区| 久久久国产精品亚洲一区| 一区二区三区欧美成人| 午夜电影亚洲| 亚洲视频导航| 欧美成年人在线观看| 欧美主播一区二区三区美女 久久精品人| 欧美mv日韩mv亚洲| 国产精品激情电影| 亚洲国产欧美久久| 国产一区二区三区av电影 | 亚洲欧美三级伦理| 久久精品综合| 欧美一级理论片| 欧美激情偷拍| 欧美高清不卡| 黑人巨大精品欧美黑白配亚洲| 久久成人资源| 欧美日韩一级视频| 亚洲国产影院| 亚洲国产美女精品久久久久∴| 久久久人成影片一区二区三区观看 | 国产人成一区二区三区影院| 亚洲国产精品久久久久婷婷老年| 久久综合久久久| 欧美一级午夜免费电影| 欧美精品aa| 亚洲国产mv| 亚洲精品国精品久久99热| 久久中文字幕一区二区三区| 久久综合中文字幕| 狠狠久久亚洲欧美专区| 欧美在线关看| 狼狼综合久久久久综合网| 国产亚洲一级| 久久国产66| 欧美sm重口味系列视频在线观看| 欧美激情精品久久久六区热门 | 亚洲免费观看在线视频| 国产一区二区三区四区老人| 久久久亚洲国产天美传媒修理工| 午夜伦理片一区| 国产精品99久久久久久久女警| 亚洲一区欧美二区| 亚洲欧美在线免费| 国产精品一卡二卡| 欧美一区不卡| 免费美女久久99| 亚洲精华国产欧美| 欧美国产第一页| 欧美一区二区三区免费观看视频| 欧美三级在线视频| 噜噜噜躁狠狠躁狠狠精品视频| 久久精品国产一区二区电影| 性8sex亚洲区入口| 国产一区二区精品| 欧美一区成人| 欧美韩日一区二区| 一区二区三区久久精品| 欧美三级视频在线| 欧美一乱一性一交一视频| 欧美v日韩v国产v| 一本色道久久| 国产老肥熟一区二区三区| 欧美一区1区三区3区公司| 欧美电影在线观看| 亚洲一区国产精品| 国产一区二区精品久久99| 欧美激情久久久久久| 一本色道久久综合亚洲精品高清 | 国产精品私人影院| 先锋资源久久| 亚洲精品久久久蜜桃 | 亚洲黄色影院| 欧美日韩影院| 久色婷婷小香蕉久久| 一本综合久久| 欧美国产日本| 久久精品三级| 亚洲一区二区av电影| 国产乱码精品一区二区三区五月婷| 亚洲激情图片小说视频| 亚洲一区二区三区久久| 国产真实乱偷精品视频免| 欧美久久婷婷综合色| 久久精品日产第一区二区| 夜夜夜久久久| 亚洲国产成人在线| 免费日本视频一区| 久久久99国产精品免费| 亚洲视频欧美视频| 亚洲激情在线播放| 国内在线观看一区二区三区| 欧美日韩在线直播| 欧美 日韩 国产 一区| 久久精品人人做人人综合| 亚洲欧美日韩精品久久亚洲区 | 香蕉久久一区二区不卡无毒影院| 欧美久久久久|