`
oldrev
  • 浏览: 233713 次
  • 性别: Icon_minigender_1
  • 来自: 昆明
社区版块
存档分类
最新评论

关联数组字面值+函数字面值=支持任意类型的 switch

阅读更多
刚才写字符串格式化的由于要处理所有内置类型,而且只有 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. }  
分享到:
评论
6 楼 yayv 2007-05-21  
我曾想用c++实现这么个东西,结果没弄成,最后还是用了if else链

用C++遇到2个问题,1.成员函数指针的复杂性远超想象,难度根要做的事情不成正比,用起来不划算。2. 不同类型重载还是要写完全不同类型的if else。 用公共基类派生多个子类无法实现运行期的类型识别(要识别并正确转型还是少不了if else)

5 楼 oldrev 2007-05-20  
似乎C++的 iostream 从来没有实际的程序用过,泛形也不是到处都适合。
4 楼 oldrev 2007-05-20  
理论上更快的 cout 实践中总是没有printf快。
3 楼 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
2 楼 qiezi 2007-05-20  
从效率上来讲,不如重载函数了,编译期就能判断了。
1 楼 tomqyp 2007-05-20  
学习~

相关推荐

    C++指定字面值的类型

    除了字符和字符串之外,C++还支持对整数和浮点数字面值进行类型指定: 1. **u/ul/ull**:分别表示无符号(unsigned)的整型字面值,其中`u`表示`unsigned int`,`ul`表示`unsigned long`,`ull`表示`unsigned long ...

    JAVA数组与字符串详解[借鉴].pdf

    JAVA数组与字符串详解 JAVA中的数组是用一个变量名表示一组相同性质的数据,每个数据称为数组元素,各元素通过下标来区分。...字符串可以是字面值,也可以是变量。字符串的操作包括连接、截取、查找等。

    python基础2day02.txt

    (不可变类型) (任意类型) 字典的字面值 {} {1: "一", 2:'二'} 构造(创建)函数 dict dict() dict(可迭代对象) dict(**kwargs) dict(a=1, b=2) 访问字典: d = {1: "一", 2:'二'} v = d[1] 修改/添加...

    设有n 种不同面值的硬币,各硬币的面值存于数组T[1:n]中。现要用这些面值的硬币来找钱。可以使用的各种面值的硬币个数存于数组Coins[1:n]中。

    设有n 种不同面值的硬币,各硬币的面值存于数组T[1:n]中。现要用这些面值的硬币来找钱。可以使用的各种面值的硬币个数存于数组Coins[1:n]中。 对于给定的1≤n≤10,硬币面值数组T和可以使用的各种面值的硬币个...

    人民币面值+冠字号编码识别挑战赛参赛源码+项目说明.zip

    【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考...人民币面值+冠字号编码识别挑战赛参赛源码+项目说明.zip

    常用算法设计+算法搜集

    // 输出剩余的骰子面值 } ``` ### 总结 本篇从算法的基本定义出发,介绍了评估算法的标准,并详细阐述了三种常见算法的设计思路及其实现方法。通过这些内容的学习,可以帮助读者更好地理解和应用算法解决问题。...

    人民币计算题.pdf

    在加法运算中,我们也可以计算不同面额的人民币组合,例如: 1张10元+2张5元+1张2元 = 22元 1张50元+1张5元+3张1元 = 58元 3张1元+2张5角 = 3元10角 2张2元+4张1元+3张2角+2张1角 = 10元7角 5张5元+3张2元 = 25元6...

    c字符串,string对象,字符串字面值的区别详解

    总结来说,C字符串是原始的字符数组,需要谨慎处理内存和边界,字符串字面值是不可变的,而`std::string`对象提供了丰富的接口和安全保障,更适用于现代C++编程。在选择使用哪种字符串类型时,应考虑其特性和应用...

    用二元一次方程组解决问题1练习题精选.doc

    - 1x + 2y = 50(总面值) 因为y比x多10张,所以第二个方程也可以写成: - x + (x + 10) = 50 解这个方程组,可以找出1元和2元邮票各有多少张。 2. 题目2:长方形与正方形问题。设长方形的长为a,宽为b。根据...

    python基础学习day04.txt

    字符串的字面值表示方式 '' "" '''''' """""" 三引号字符串可以隐式换行,换行会自动转换为'\n' 转义序列 \n \t \\ \' \" \xXX \uXXXX 编码: ASCII (128个) UNICODE16(65536个) / UNICODE32 raw 字符...

    人民币的认识练习题.1.doc

    这份练习题旨在帮助学生熟悉人民币的面值、换算以及进行简单的加减运算。 一、人民币的面值 人民币的单位包括元、角和分。元是最大的单位,1元等于10角,1角等于10分。例如,1.50元意味着1元加上50分,也就是150分...

    一年级数学《认识人民币》练习.doc

    这是一个匹配人民币金额的游戏,让学生将不同面额的人民币与相应的数字连接起来。例如,3元5角应该与3.50元相连,5元6角对应5.60元,以此类推。 三、解决问题 1. 铅笔盒8元,橡皮5角,两者总价为8元+5角=8元5角。 ...

    人民币练习题.doc

    人民币的兑换涉及到不同面额之间的转换。例如: 5元能换(5)1元,2角能换(2)1角,10元能换(5)2元,100元能换(5)20元或(10)10元,50元能换(5)10元,10元能换(2)2元和(1)1元,100元能换(2)50元,5角...

    C语言软件大赛编程题

    - 更新计数器`count += num`。 5. **输出结果:** 输出最少货币数量`count`。 **代码示例:** ```c #include int main() { int coins[] = {343, 49, 7, 1}; int count = 0; int amount = 10015; for (int ...

    84三元一次方程组的解法 (2).ppt

    在案例中,小明有12张不同面额的纸币,总额为22元,其中1元纸币是2元纸币的四倍。这形成了一个三元一次方程组,即 `x + y + z = 12`,`x + 2y + 5z = 22`,`x = 4y`。这里,`x`、`y`、`z`分别代表1元、2元和5元纸币...

    记录所有有关java的学习笔记.rar

    1.整数字面值是int类型,如果右侧赋值超出int范围,需要做转型处理 2.byte,short,char 三种比int小的整数,在自身范围内可以直接赋值。 byte d=1+3 正确,1+3编译器会自动转成4 3.浮点数字面值是double;浮点数...

    五年级下册列方程解应用题提高题精选.doc

    4. 人民币面值问题:设伍元的人民币有x张,拾元的有y张。根据题意列出方程组:x + y = 14 和 5x + 10y = 100,解得x=9, y=5。 5. 汽车速度问题:设原计划时间为t小时。根据题意,去程早到1小时,回程迟到1小时,...

    换钱问题

    它要求我们用给定的硬币或纸币类型组合成特定的金额,并通常会限制每种类型的数量。本文将详细解析一个具体的换钱问题及其C语言解决方案,即如何将一张100元的人民币换成100张由5元、1元和0.5元组成的零钞,且每种...

    硬币兑换问题的动态规划求解算法

    首先,我们初始化一个二维数组 c,用于存储每种硬币面值下的最少硬币数量。然后,我们可以使用递推公式来计算出每种硬币面值下的最少硬币数量。 在计算时,我们可以使用以下步骤: 1. 初始化数组 c,所有元素都...

Global site tag (gtag.js) - Google Analytics