2012-02-27 104 views
6

我在尋找更專業的問題解決方案。 我工作的C++ SOAP2 solution.I有大約25元C++結構:通過名稱獲取屬性

struct X { field 1; field 2; .. };  

的Strcut確定指標,我特林一些映射值

Map<String,String> A  

以填補它,它似乎非常煩人做n次這樣的事

X->xx = A["aaa"]  

每次我想填補我的SOAP消息結構。

問題:可以通過名稱調用struct元素嗎? *例如:要安倍來處理這樣的:

X->get_instance_of("xx").set(A["aaa"]);  

,放入一個循環.. *

謝謝,

+0

是否屬於同一類型的所有成員? – dasblinkenlight 2012-02-27 16:45:42

+0

循環通過什麼?解決辦法是設置一些綁定,但很難知道,因爲您沒有提供足夠的信息。 – CashCow 2012-02-27 16:53:37

+0

結構總是一樣的嗎?和..是不同的字段類型? – 2012-02-27 18:45:59

回答

1

號C++沒有反射。 Java雖然。不出所料,與Java等語言相比,與SOA相關的東西更可能遇到像C這樣的語言。

+1

不確定這是真的。 Java中的SOAP API生成代碼包裝作爲編譯步驟。 C++爲什麼不應該存在?沒有必要爲此使用反射。 – 2012-02-27 17:05:43

+0

它肯定也可以在C++中完成,並且使用成員指針和函數重載。 – Nawaz 2012-02-27 17:07:12

+0

@KonradRudolph [C++中間件編寫器](http://webEbenezer.net)就是這樣做的。 – 2012-02-27 17:14:35

1

這並不是真的有可能;您需要的信息在運行時不再存在。你可能可以用map和一些指針來做些事情,但說實話,你可能會更好,只需要將它包裝在一個函數中,並將其值放入一個map並將值放入適當的字段。

2

簡答:沒有。這是C++,一種靜態編譯的語言,其中結構成員名稱由編譯器轉換爲內存偏移量。它不像PHP或Python那樣運行時涉及所有變量引用。

8

C++缺少內置的反射更多動態語言的功能,所以你不能做你想用的語言的開箱即用功能。

但是,如果所有的成員都是同一類型的,你可以用地圖指針的成員和一些準備這樣做:

// typedef for the pointer-to-member 
typedef int X::*ptr_attr; 

// Declare the map of pointers to members 
map<string,ptr_attr> mattr; 
// Add pointers to individual members one by one: 
mattr["xx"] = &X::xx; 
mattr["yy"] = &X::yy; 

// Now that you have an instance of x... 
X x; 
// you can access its members by pointers using the syntax below: 
x.*mattr["xx"] = A["aa"]; 
+2

即使它們是不同的類型,也可以通過函數重載來完成。 – Nawaz 2012-02-27 16:54:06

+0

@Nawaz當然,但這需要一個完全不同的解決方案。而且,這樣的解決方案很可能比我提出的方案更優雅。 – dasblinkenlight 2012-02-27 16:58:39

+0

是的。 [@Johannes Schaub](http://stackoverflow.com/users/34509/johannes-schaub-litb)給出了一個這樣的解決方案:http://stackoverflow.com/a/287353/415784 – Nawaz 2012-02-27 17:27:10

0

你可以用一組你的結構創建一個包裝OBJET /獲取訪問器,這將允許您迭代字符串值以填充/讀取靜態的基礎結構。