1. 程式人生 > >C++實現反射(Reflection)

C++實現反射(Reflection)

C++實現Reflection

最近1年多,我一直在琢磨和大量使用cli來開發遊戲專案,.net系統的反射系統給我
的開發設計思路,帶來了很大的衝擊。反射真的可以從根本上,讓設計思路相對傳統
開發模式有很大的改變。
但是反射通常都提供在類似java等動態語言上,後來ms在.net平臺上推出了一個很強
大完善的反射機制,我最近1年多的專案都是大量使用他,為我的專案開發,做出了很
多有意思的東西。但是我的victory3d的core因為效率原因,依然是採用純C++開發,
享受不到.net平臺的便利。不少人在呼籲C++標準組織,給C++新增上反射特性,但是
據我所知C++0x規範目前也就能搞一個gc什麼的,對於reflection的支援,還不知道要
什麼時候。
於是,我決定自己嘗試實現一下在c++中,實現reflection,經過2天試驗,目前基本
達成實際目標,下面是一個我的c++反射一個class的例子:

 ///<ReflectExport name="MyTestClass"/>
 class testclass : public VReflectBase
 {
 public:
  ///<ReflectExport/>
  void fun0()
  {
   return;
  }
  ///<ReflectExport/>
  int fun1(float a)
  {
   return 0;
  };
 };

 ///<ReflectExport name="MyTestClass"/>
 class testclass2 : public testclass
 {
 public:
  ///<ReflectExport/>
  float fun3(int a)
  {
   return 0;
  };
 };

 DEF_REFLECT(reflect::testclass,NullObject)

 BEGIN_REFLECT_METHOD(reflect::testclass)
  REF_METHOD0(reflect::testclass,fun0,void)
  REF_METHOD1(reflect::testclass,fun1,int,float)
 END_REFLECT_METHOD

 DEF_REFLECT(reflect::testclass2,testclass)

 BEGIN_REFLECT_METHOD(reflect::testclass2)
  REF_METHOD1(reflect::testclass2,fun3,float,int)
 END_REFLECT_METHOD

 void reflect_test()
 {
  //建立ClassType資訊
  ClassExporter<reflect::testclass>::BuildClass();
  ClassExporter<reflect::testclass2>::BuildClass();

  ClassExporter<reflect::testclass>::BuildMethod();
  ClassExporter<reflect::testclass2>::BuildMethod();

  //獲得testclass的ClassType
  VClassType* pp = ClassExporter<reflect::testclass>::ClassType;
  VClassType* pp2 = ClassExporter<reflect::testclass2>::ClassType;

  testclass obj;

  std::vector<ObjBase*> args;
  pp->Methods[0]->Invoke( &obj , args );

  ObjBase arg1;
  arg1.f = 1.2f;
  args.push_back(&arg1);
  pp->Methods[1]->Invoke( &obj , args );
 }

testclass和testclass2兩個類,通過兩段巨集,就可以把反射資訊倒出來,最後,通過一個
template ClassExporter類來操作classType,整體看起來,使用方便性方面和.net的基本
接近,倒出過程因為我是執行中獲得,cli是編譯器獲得,顯得複雜一點,不過這個,我們
可以通過外部工具,掃描倒出類的申明來自動產生。也就不是什麼工作量了。
哈哈,以後只要我願意,我甚至可以讓自己的指令碼隨意call我victory3d最核心的c++任何
方法了。c++ reflection我再完善完善,就整合在victory中,並且廣泛使用了,到時候,
我會將reflection部分程式碼完整的貼在blog,和大家一起討論。 

相關推薦

C++實現反射Reflection

C++實現Reflection 最近1年多,我一直在琢磨和大量使用cli來開發遊戲專案,.net系統的反射系統給我的開發設計思路,帶來了很大的衝擊。反射真的可以從根本上,讓設計思路相對傳統開發模式有很大的改變。但是反射通常都提供在類似java等動態語言上,後來ms在.net平

C++實現反射

上一篇我們用一個 Object 類,讓所有需要反射的類都繼承這個物件,這樣雖然解決了問題,但是用起來不太方便。Object 類的存在主要為了解決儲存和返回時的型別問題,如果取消這個類,我們怎麼對這些反射類做統一處理呢?答案當然是模板。 實現一個模板類管理類名和類建構函式的對映

C++實現反射

找了一些資料,參考了 C++反射——開源中國 這篇,做了一些修改和簡化,成為了 Version3. 思路其實並不複雜,可以進行反推: 1. 反射是根據類名動態生成類,如果我們有一個全域性的對映關係,可以從類名得到類的相關資訊 ClassInfo,包括類的建構函式,那麼我們便能實現這

C++ 實現反射

反射,就是根據一個類名,即可根據類名獲取類資訊,建立新物件。反射在很多語言都天然支援,然而不包括 C++,但我們肯定會經常遇到這種根據類名生成物件的場景,這就需要我們自己動手來實現了。反正 C++ 這麼強大,一定沒有問題 :) version 1 我們略做思考,就可以想到一種最簡

C# 反射Reflection的用處分析

roi 文章 acc contain fin oid bject 打印 normal 亂侃 作為一名新手,一直沒有勇氣去寫一篇分享。原因有很多:諸如:自己水平有限、語言表達不準確、寫出的東西沒有一點技術點被人嘲笑。今天在公司聽了內部員工的一個分享,其中最重要的一點是:

C# 反射Reflection

message console 反射 .html sys getmethod png source 文件 什麽是反射 發射是 .net framework 提供的一個幫助類庫,用於讀取和使用元數據。 用到的類:System.Reflection,System.Type。

Swift - 反射Reflection的介紹與使用樣例附KVC介紹

comment 人員 BE display java pri ex18 pla 是否 1,反射(Reflection) 對於C#、Java開發人員來說,肯定都對反射這個概念相當熟悉。所謂反射就是可以動態獲取類型、成員信息,同時在運行時(而非編譯時)可以動態調用任意方法、屬性

c實現功能13實現單向連結串列的簡要功能

#include <stdio.h> #include <stdlib.h> //利用結構體建立節點 struct list{ //建立資料域 int data; //建立指標域 struct list *next; }; //實現建立一個

Java基礎——反射Reflection

一、什麼是反射 在執行狀態中,對於任意一個類,都能夠獲取到這個類的所有屬性和方法,對於任意一個物件,都能夠呼叫它的任意一個方法和屬性(包括私有的方法和屬性),這種動態獲取的資訊以及動態呼叫物件的方法的功能就稱為java語言的反射機制。通俗點講,通過反射,該類對我們來說是完全透明的,想

Java反射reflection特點

*.class檔案介紹 學習Java的初學者都知道Java中存在JVM來包裝java語言使得java在各種機器上都能很好的執行。一個*.java的檔案首先編譯成*.class檔案,*.class檔案是JVM能夠識別的檔案,最後*.class檔案在JVM下編譯成機器可以識別的二進位制檔案。

c實現功能5實現字串轉換成數字

#include <stdio.h> int main() { //實現字串轉換成數字 char str[10] = "123"; //求取字串的長度 int len = 0; while (str[len++]); len--; //設定和

c實現功能7寫入和讀取文字檔案

#include <stdio.h> #include <string.h> int main() { //向一個檔案中寫入內容 char s[1024] = {0}; //開啟一個檔案 FILE *p = fopen(

c實現功能8簡單實現文字的加密

#include <stdio.h> #include <string.h> //實現對檔案的加密函式 void encode(char *s){ while (*s) { (*s)++; s++; }

c實現功能9對文字的內容進行排序

#include <stdio.h> #include <string.h> #include <stdlib.h> void swap(int *p1, int *p2){ int temp = *p1; *p1 = *

c實現功能10對文字內容進行計算

#include <stdio.h> #include <string.h> #include <stdlib.h> //實現對文字內容的計算 //首先實現對文字中每一行內容的計算 int calcString(char *s){

c實現功能11對二進位制檔案的讀寫

#include <stdio.h> #include <string.h> int main(){ //實現對二進位制檔案的讀取 //開啟檔案 FILE *p = fopen("D:\\test\\a.wmv", "rb")

Ruby中的反射Reflection-通過類名稱構造類物件

在Java語言中,提供了發射機制,通過發射機制可以通過字串構造出這個物件,可以獲取物件的所有方法(包括私有方法),可以呼叫私有方法,可以更改成員變數的值(包括私有的成員變數)。 Ruby也是面向物件的高階語言,當然也提供了反射機制,今天我們討論通過類名稱構造類物件的功能。 我們先看普通的構造: m

Ruby中的反射Reflection- 操作成員變數和私有方法

上一篇文章我們說到了Ruby中的反射(Reflection)-通過類名稱構造類物件。 使用過Java反射的同學們都知道,有了物件之後,操作成員變數和私有方法也就不在話下了。 Ruby中也是一樣。 先看操作成員變數的例子。我們嘗試更改一個成員變數的值。(接著上一片文章的程式碼) #manpulate

c++ 實現 膨脹dilate腐蝕erode

int main() { Mat img=imread("lena.jpg"); cv::cvtColor(img,img,CV_BGR2GRAY); int imageWidth = img.cols; int imageHeight = img.rows; showImage(

【Swift】反射Reflection的介紹

1,反射(Reflection) 對於C#、Java開發人員來說,肯定都對反射這個概念相當熟悉。所謂反射就是可以動態獲取型別、成員資訊,同時在執行時(而非編譯時)可以動態呼叫任意方法、屬性等行為的特性。 以Java上的兩個知名框架(hibernate和spr