作者reader (读者)
看板CSSE
标题Re: [讨论] 另一种 C++ 巨集
时间Wed Feb 23 19:45:59 2005
※ 引述《reader (读者)》之铭言:
: 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());
: }
不过显然地,这个机制是和动态连结冲突的,但样板成员函式也是如此,
并没有太特别。
重点是,这样一来就可以简单达成 delegation 了。
比较神秘的地方是 operator 可不可以使用这个功能? 我的看法是可以,
不过应该有较多限制,例如过载就不能使用了:
class textfile {
public:
bool readline(int s, char* d); // read a line
textfile& operator | (ref t) {
char b[256];
while(readline(256, b)) t;
return *this;
}
textfile(const char*); // open file
};
void main() {
textfile f("test.txt");
f | { printf("%s", b); }; // 把每一行列印出来
}
这样子写程式够方便吧。如果要用前置处理的话,可能会变成这样:
class textfile {
...
textfile _op_bit_or_1() {
char b[256];
while(readline(256, b)) { printf("%s", b); }
return *this;
}
};
void main() {
textfile f("test.txt");
f._op_bit_or_1();
}
看起来并没有什麽大问题。当然,程式码的膨胀是免不了的,
那就是代价了,这和 template 的状况也是类似的。
只是可以想见,这样的前置处理程式,并不是很容易写的。可能
我得找一段较空闲的时间来试试看。
另外还有几个东西也可以尝试着做成 C++ extension, 或许可以
先做一个前进半步的新程式语言,往後再来发展更进一步的程式
语言,而不必一步到位。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.222.173.26