精華區beta CSSE 關於我們 聯絡資訊
※ 引述《reader (讀者)》之銘言: : : struct A { : : void f() { ... } : void g(void t()) { t(); } : : }; : : void f() { ... } : : void g(void t()) { t(); } : : void main() { : : A a; : : void b() = { f(); } : : g(b); // 執行 f() : a.g(b); // 執行 A::f() 還是 f() ?? : : } : 針對這個例子,如果不接受重定義或重設定的話,按照 C++ 的靜態思維, 其實是可以建立一個新特性的。 或許就增加一個 ref 型別關鍵字,讓它變成這樣: struct A { void f() { ... } void g(ref t) { t; } }; ref b; void f() { ... } void g(ref t = b) { t; } // 可以使用預設參數 ref b = { f(); }; // 寫成 ref b = f(); 也可以 void main() { A a; g(b); // 執行 f() a.g(b); // 執行 A::f(), 也可以寫成 a.g({ f(); }); 或 a.g(f()); } 一般必須在執行時期處理的狀況,主要是因為有遞迴問題和設值問題, 例如: int f(int i) = { if(i < 2) return 1; return f(i-1) + f(i-2); } void g(int x) { f = f(x); } 像這樣子就不能在編譯時期完成了。但是這並不是主要應用,就 C++ 的 原始想法而言(我搞不懂現在 C++ 標準委員會的想法),可以避免動態 機制的話就儘量避免,而現在看起來是做得到的。 -- ※ 編輯: reader 來自: 61.222.173.26 (02/23 17:32)
jeunder:恕我愚鈍, 體會不出你的例子有 "必須在執行時期 61.230.218.28 02/23
jeunder:處理" 的必要性耶... Q_Q 61.230.218.28 02/23
jeunder:感覺上只是 compile time 的文字代換而已 61.230.218.28 02/23