`
oldrev
  • 浏览: 229902 次
  • 性别: 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  
学习~

相关推荐

    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和可以使用的各种面值的硬币个...

    C++指定字面值的类型

    C++中常量赋值的类型设置,如u8"Hi

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

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

    python基础学习day04.txt

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

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

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

    最少硬币问题 王晓东版

    设有n种不同面值的硬币,各个硬币的面值存在于数组T[1:n]中,现在要用这些面值的硬币来找钱,可以使用各种面值的硬币个数存在于数组coin[1:n]中 对于任意钱数,设计一个用最少硬币找钱的方法 数据输入:由文件...

    matlab实验2

    1、编写M脚本文件,m的范围为[0,2π],步长取0.02π,计算函数y1=5e-2tsin(t),y2=...6、编写M函数文件,求解下题:将一张面值是100元的钱等值转换为5元、1元和0.5元的零钞,要求每种零钞至少一张,求所有的兑换方式。

    拼字游戏

    要求 给定一个单词,计算该单词的拼字游戏分数。 字母值 您将需要以下这些: 信 价值 A,E,I,O,U,L,N,R,S,T 1个 D,G ...scrabble = Scrabble ....scrabble ....scrabble = Scrabble ....scrabble ....

    老生常谈JavaScript数组的用法

    JavaScript数组简介 JavaScript中的数组与其他语言中的数组是不同的,主要体现在: 数组中存储的各项可以是不同类型的数据 数组的大小是动态变化的,当新增项时或移除...其二:使用字面值法创建(使用这种方法创建数组

    Go语言小细节——内置类型键值或下标规则

    数组和切片组合字面值中下标规则 数组和切片组合字面值中的下标必须为整数常量 在一个数组或切片组合字面值中,如果一个元素的索引下标缺失,则编译器认为它的索引下标为出现在它之前的元素的索引下标加一 package ...

    钱币组合问题/动态规划/C语言

    问题描述:设有 n 种不同的钱币各若干张,可用这 n 种钱币产生许多不同的面值。试 设计一个算法,计算给定的某个面值,能有多少种不同的产生方法。例如有 1 分3 张,2 分 3 张,5 分 1 张,则能组成 7 分面值的...

    在Java中使用下划线分隔数的字面值的用法讲解

    主要介绍了在Java中使用下划线分隔数字的字面值的用法讲解,这是Java7以后加入的新特性,需要的朋友可以参考下

    最少硬币问题

    对于给定的1≤n≤10,硬币面值数组T和可以使用的各种面值的硬币个数数组Coins,以及钱数m,0≤m≤20001,编程计算找钱m的最少硬币数。 数据输入: 第一行中只有1 个整数给出n的值,第2 行起每行2 个数,分别是T[j]和...

    C#动态规划法解最少钱币问题

    Description 设有 n 种不同面值的硬币,各硬币的面值... 对任意钱数0<=m<=20001,对于给定的1≤n≤10,硬币面值数组T和可以使用的各种面值的硬币个数数组Coins,以及钱数m,0≤m≤20001,编程计算找钱m的最少硬币数。

    [附答案]计算出需要的各种面值的钱币的类型及数量

    输入一个金额,计算出需要的各种面值的钱币的类型及数量, 1、将需要的面值及使用数量显示到屏幕上 2、按各面值的钱币的大小排序,再次将需要的面值及使用数量显示到屏幕上(使用张数为0的不输出) 3、将第二步的...

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

    一、字符串字面值字符串字面值是一串常量字符,字符串字面值常量用双引号括起来的零个或多个字符表示,为兼容C语言,C++中所有的字符串字面值都由编译器自动在末尾添加一个空字符。字符串没有变量名字,自身表示自身...

    8595 钱币组合方法数的问题

    初始,该数组全清零,然后逐个加入第i种面值的钱币(1<=i<=n),并修改影响到数组d的方法数。 设d[i,j]:表示前i种钱币组成面值j分的方法数,1<=i<=n,1<=j<=m。则: d[1,j] = 1, if j%v[1]=0 && j/v[1]<=k[i]; d[1,j...

    Kotlin 语言文档

    Kotlin 语言文档 官方文档

Global site tag (gtag.js) - Google Analytics