刚才写字符串格式化的由于要处理所有内置类型,而且只有 TypeInfo 可用,为了避免恐怖的 if 链,发明了下面这个有趣的switch模拟。

D语言真是太好玩了。
D代码
 
  1. import std.stdio;  
  2.   
  3.   
  4. alias void delegate() Case;  
  5.   
  6. void Switch2(T)(T cond, Case[T] aa)  
  7. {  
  8.     aa[cond]();  
  9. }  
  10.   
  11.   
  12. void main()  
  13. {  
  14.   
  15. /////////////////// 方法1 //////////////////  
  16.     Case[TypeInfo] Switch()  
  17.     {  
  18.         return [  
  19.             typeid(int):  
  20.             {  
  21.                 writefln("int type");  
  22.             },  
  23.   
  24.             typeid(double):  
  25.             {  
  26.                 writefln("dobule type");  
  27.             }  
  28.         ];  
  29.     }  
  30.   
  31.     Switch[typeid(double)]();     
  32.   
  33. //////////// 方法2 ///////////////  
  34.   
  35.     Switch2(typeid(double), [   
  36.   
  37.             typeid(int):   
  38.             {  
  39.                 writefln("int type");  
  40.             },   
  41.               
  42.             typeid(double):   
  43.             {  
  44.                 writefln("long type");  
  45.             }   
  46.         ]  
  47.     );  
  48.   
  49. }  
评论
yayv 2007-05-21
我曾想用c++实现这么个东西,结果没弄成,最后还是用了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
学习~
发表评论

您还没有登录,请登录后发表评论

oldrev
搜索本博客
我的相册
7e9318d5-c74f-36e0-81a3-beb68acaa2b8-thumb
Screenshot
共 1 张
最近加入圈子
存档
最新评论