作者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