作者reader (讀者)
看板CSSE
標題[討論] 另一種 C++ 巨集
時間Wed Feb 23 17:28:46 2005
※ 引述《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)
1F:推 jeunder:恕我愚鈍, 體會不出你的例子有 "必須在執行時期 61.230.218.28 02/23
2F:→ jeunder:處理" 的必要性耶... Q_Q 61.230.218.28 02/23
3F:推 jeunder:感覺上只是 compile time 的文字代換而已 61.230.218.28 02/23