取得 member list

作者: CoNsTaR ((const *))   2016-04-18 06:31:58
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
Linux clang
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
問題(Question):
我知道 C++ 沒有 Reflection
但是有沒有可能用類似 SFINAE 之類的技巧達到取得 field names 或是 member list 的

要是可行的話類似這樣的設計不是滿漂亮的嗎
class UserTerm : public Frame
{
public:
 UserTerm ()
 : Frame () { _M_init (); }
 UserTerm (const UserTerm &other) = delete;
 UserTerm (UserTerm &&other) = delete;
 …………
protected:
 Button _M_button_next;
 Button _M_button_cancel;
 TextBox _M_textbox_desc;
 Radio _M_radio_agree;
 Radio _M_radio_disagree;
 …………
private:
 void _M_init ()
 { /* 初始化元件 */ }
};
virtual void
UserTerm::_M_show () const
{ /* members.show (); */ }
要是能夠取得 member list,那 _M_show 就可以不用開放給用戶端
用戶端只要把想要的元件塞進 class 裡,然後在 _M_init 設個大小位置之類的初值即可
這樣看起來超棒的啊 所見即所得,不知道有沒有什麼方法可以達成 get_fields ()?
我翻了好多資料都沒有找到比較好的作法 所有人給的答案都是 impossible……
可是我想要的東西在 compile time 就可以確定了啊,應該也不需要什麼 runtime 的技
術?
餵入的資料(Input):
預期的正確結果(Expected Output):
錯誤結果(Wrong Output):
程式碼(Code):(請善用置底文網頁, 記得排版)
補充說明(Supplement):
作者: ronin728 (浪人)   2016-04-18 09:16:00
所以有人才說C++是半吊子的OOPL嘛www。效率不吃緊的話,Hash map或平衡樹放Function pointer有搞頭吧
作者: Frozenmouse (*冰之鼠*)   2016-04-18 10:12:00
其實我看不太懂XD 你是要在compile time就取出所有的members嗎?真有reflection還是得在runtime啊…
作者: Caesar08 (Caesar)   2016-04-18 10:33:00
看不懂問題... 你可以說清楚一點嗎?有點好奇,N3996、N4111、N4451為啥都沒出現在gcc上面Static reflection這是你要找的東西嗎?
作者: BlazarArc (Midnight Sun)   2016-04-18 11:43:00
把所有member塞入list<Control*> 然後去實作show?看class header就知道布局...你要init在header?
作者: bibo9901 (function(){})()   2016-04-18 12:29:00
可以用tuple啊 如果不嫌醜的話XD
作者: IKAFIRE (沒有)   2016-04-18 12:33:00
新增一個函式讓子類別登錄元件?
作者: damody (天亮damody)   2016-04-18 12:41:00
UE4有做 不過各有利弊啦
作者: loveflames (咕啾咕啾魔法陣)   2016-04-18 13:17:00
用typelist?
作者: longlongint (華哥爾)   2016-04-18 14:57:00
然後你做完之後發現自己實作了 python
作者: BlazarArc (Midnight Sun)   2016-04-18 15:45:00
樓上XD
作者: ctrlbreak   2016-04-18 21:53:00
C++如果能怎樣怎樣寫就好了...然後就有新的語言誕生
作者: uranusjr (←這人是超級笨蛋)   2016-04-27 15:58:00
是不會那麼誇張啦, 最多只會發現你實作了 Qt 的 metaobject system 和 MOC XD

Links booklink

Contact Us: admin [ a t ] ucptt.com