2013-02-28 146 views
0
class myFun(Employee obj, String attribute) 
{ 
    //return proper attribute value without using conditions like If-Else, ternary or  
    // conditional operators like && etc. 
} 

,如果我現在撥打:C++對象與屬性名稱輸出作爲字符串

myFun(obj, 「name」); 

然後這個功能應該僱員的從對象返回名「OBJ」,這是作爲參數傳遞。所以根據屬性值的名稱,它應該返回該對象的屬性值。

有沒有辦法在C++中做到這一點,而不使用條件或開關語句?我知道在Python中我們可以使用getattr。

+0

- 框架?在C++中沒有'Object'。 Employee如何定義? – 2013-02-28 11:11:03

+0

如果需要按名稱訪問屬性,則應考慮使用「std :: map」。 – Axel 2013-02-28 11:13:53

+0

對不起,對象部分..其基本上是一個類 – 2013-02-28 11:19:37

回答

0

不,C++沒有反射,所以沒有條件它是不可行的。

3

您需要實施自己的reflection類行爲。例如,你可以在你註冊每個屬性名稱的對象內部有一個映射,也可以有一個函數來獲取值(或某物)。

換句話說,它是可行的,但不受該語言支持,因此它不會對您的代碼的其他讀者而言很短,簡單,自動或非常直觀。

+0

你可以提供一些示例代碼,這已經有效地實現了嗎? – 2013-02-28 11:14:23

0

如果不改變班級結構,這是不可能的。 如果性能並不重要,這裏是一個解決辦法:

class Employee{ 
    std::map<std::string, std::string> attributes; 
    /*SNIP*/ 
    public: 
    void addAttr(std::string attr, std::string value){ attributes[attr] = value; } 
    std::string getValue(std::string attr){ return attributes[attr]; } 
    //Use this function if you are using c++11 compiler: std::string getValue(std::string attr){ return attributes.at(attr); } 
} 
+0

你確定你需要列表嗎? – 2013-02-28 12:19:31

0

反思是可能在C++中,儘管間接)

一些與此相關的文章...

http://lcgapp.cern.ch/project/architecture/ReflectionPaper.pdf http://replicaisland.blogspot.co.il/2010/11/building-reflective-object-system-in-c.html http://www.vollmann.com/pubs/meta/meta/meta.html

所以,你用反射來實現!當然,這些文章包含您可以使用的示例,可以隨時分享任何問題。

你也可以給嘗試是否使用了C++來BOOST_FUSION_ADAPT_STRUCT http://boost-spirit.com/dl_more/fusion_v2/libs/fusion/doc/html/fusion/extension/macros/adapt_struct.html

相關問題