2007-05-19
关联数组字面值+函数字面值=支持任意类型的 switch
关键字: Hash D
刚才写字符串格式化的由于要处理所有内置类型,而且只有 TypeInfo 可用,为了避免恐怖的 if 链,发明了下面这个有趣的switch模拟。
D语言真是太好玩了。
D语言真是太好玩了。
D代码
- import std.stdio;
- alias void delegate() Case;
- void Switch2(T)(T cond, Case[T] aa)
- {
- aa[cond]();
- }
- void main()
- {
- /////////////////// 方法1 //////////////////
- Case[TypeInfo] Switch()
- {
- return [
- typeid(int):
- {
- writefln("int type");
- },
- typeid(double):
- {
- writefln("dobule type");
- }
- ];
- }
- Switch[typeid(double)]();
- //////////// 方法2 ///////////////
- Switch2(typeid(double), [
- typeid(int):
- {
- writefln("int type");
- },
- typeid(double):
- {
- writefln("long type");
- }
- ]
- );
- }
评论
yayv
2007-05-21
我曾想用c++实现这么个东西,结果没弄成,最后还是用了if else链
用C++遇到2个问题,1.成员函数指针的复杂性远超想象,难度根要做的事情不成正比,用起来不划算。2. 不同类型重载还是要写完全不同类型的if else。 用公共基类派生多个子类无法实现运行期的类型识别(要识别并正确转型还是少不了if else)
用C++遇到2个问题,1.成员函数指针的复杂性远超想象,难度根要做的事情不成正比,用起来不划算。2. 不同类型重载还是要写完全不同类型的if else。 用公共基类派生多个子类无法实现运行期的类型识别(要识别并正确转型还是少不了if else)
oldrev
2007-05-20
似乎C++的 iostream 从来没有实际的程序用过,泛形也不是到处都适合。
oldrev
2007-05-20
理论上更快的 cout 实践中总是没有printf快。
qiezi
2007-05-20
import std.stdio;
void output1(int n) {
writefln("int: ", n);
}
void output1(double f) {
writefln("double: ", f);
}
void output(T...)(T args) {
foreach(a; args)
output1(a);
}
void main() {
output(1, 3.0f);
}
输出:
引用
int: 1
double: 3
qiezi
2007-05-20
从效率上来讲,不如重载函数了,编译期就能判断了。
tomqyp
2007-05-20
学习~
发表评论
- 浏览: 105131 次
- 性别:

- 来自: 昆明

- 详细资料
搜索本博客
我的相册
Screenshot
共 1 张
共 1 张
最近加入圈子
最新评论
-
出色的开源项目管理软件— ...
我也是前几天刚刚从trac换到redmine,感觉好多了,trac有的redmi ...
-- by danielking -
转贴:鲁迅未收入全集的文 ...
借问酒家何处有,牧童遥指杏花村
-- by hqs7636 -
Range Coding 的 D 实现
引用oldrev 2008-01-12LZMA SDK 只是一个 LZMA 算法 ...
-- by oldrev -
D 静态数组初始化大bug
看看日期好伐?
-- by oldrev -
D新闻组里的天才代码
没看过产生的汇编代码,测试了是可行的。如果用宏来实现就完美了
-- by oldrev






评论排行榜