d中变量很酷
标.变量,以变量为中心,其不是c++的变量,而是可包含任意类型值的类型安全容器.其也知道包含的值的类型,c++却用变量这个名字来实现聚集(并)类型.
导入 标.变量;
变量 a;
a=42;
断定(a.类型==具型(整));
a+=1;
断定(a==43);
浮 f=a.取!浮;//转为浮
断定(f==43);
a/=2;
f/=2;
断定(a==21&&f==21.5);
a="[!串000]";
断定(a.类型==具型(串));
变量 b=新 对象();
变量 c=b;
断定(c 是 b);//bc指向相同
b/=2;//不匹配,错误
标.变量也提供了并类型,代数.另一个是元组.代数是编译时特定类型列表.与变量差不多.
如果类型不匹配,会报编译错误.像这样:
别名 无效=的型(无效);//[!注释003]
别名 选项(T)=代数!(T,无效);
选项!大小型 的索引(整[]干草堆,整 针头){
每一(大小型 i,整 n;干草堆)
如(n==针头)
中 选项!大小型(i);
中 选项!大小型(无效);
}
整[]a=[4,2,210,42,7];
选项!大小型 索引=a.的索引(42);//统调,
断定(!索引.偷看!无效);//断定没有
断定(索引==大小型(3));
选项!大小型 索引2=a.的索引(117);
断定(索引2.偷看!无效);
偷看函数,把变量作为运行时参数,T作为编译时参数.仅当变量有T类型时,返回变量的值的指针,否则返回无效针.
d的变量也能访问代数上函数.允许当为适当类型,则运行相应类型函数.
总结:
1,标.变量.变量等价于标::任何,类型安全的可包含任何值的类型.
2,标.变量.代数等价于标::变量,即并类型,是个限制类型的变量的简单包装.
3,标.变量与标::访问一样,提供访问函数来分发处理函数.
现在来说c++访问的问题.并看看d的编译时自省和生成代码的厉害.
c++问题:模板难看,元编程麻烦,工具少,实现访问者很难.用λ函数:
元<类...Fs>
构 重载;
元<类 F0,类...O>
构 重载<F0,O...>:F0,重载<O...>
{
重载(F0 f0,O...其余):F0(f0),重载<O...>(其余...){}
用 F0::符号();
用 重载<O...>::符号();
};
元<类 F0>
构 重载<F0>:F0
{
重载(F0 f0):F0(f0){}
用 F0::符号();
};
元<类...Fs>
动 造访问者(Fs...fs)
{
中 重载<Fs...>(fs...);
}
c++17可简化为:
元<类...Ts>构 重载:Ts...{用 Ts::符号()...;};
元<类...Ts>重载(Ts...)->重载<Ts...>;
元<类...Fs>
动 造访问者(Fs...fs)
{
中 重载<Fs...>(fs...);
}
来自参考的示例,如何极致的使用访问:
元<类...Ts>构 重载:Ts...{用 Ts::符号()...;};
元<类...Ts>重载(Ts...)->重载<Ts...>;
用 变量型=变量<整,长,双精,串>;
向量<变量型>向量={10,15l,1.5,"你好"};
对(动&v:向量){
访问(重载{
[](动 参){输出<<参<<' ';},
[](双精 参){输出<<固定<<参<<' ';},
[](常 串&参){输出<<引用(参)<<' ';},
},v);
}
d可以干得更好.实现造访问者.
导入 标.特征:形参;
构 变量访问者(函数...)
{
函数 fs;
本(函数 fs){本.fs=fs;}
静 每一(i,函数;函数)//不同函数,不同重载
动 调用操作(形参!函数 形参){中 fs[i](形参);}
}
动 造访问者(函数...)(函数 fs)
{
中 变量访问者!函数(fs);
}
就完了,你服不服?.仅接收闭包/函数.基于签名来分发函数.
d是反样板语言,都是直接解决问题,访问以编译时函数列表为参数,不必创建新构,并写造访问者之类.
d更少选择,但更快,更安全,更轻松.用标.变量.访问,直接:
代数!(串,整,极)v="[!串001]";
v.访问!(
(串 s)=>写行("[!串002]",s),
(整 n)=>写行("[!串003]",n),
(极 b)=>写行("[!串004]",b),
);
比较c++:
元<类...Ts>构 重载:Ts...{用 Ts::符号()...;};
元<类...Ts>重载(Ts...)->重载<Ts...>;
变量<串,整,极>v="[!串005]";
访问(重载{
[](常 串&s){输出<<s<<'\n';},
[](整 n){输出<<n<<'\n';},
[](极 b){输出<<b<<'\n';}
},v);
d看起来与内置模式匹配语法类似.很强大.可读性:
//[!注释007]
v.访问!((参){
别名 T=不合格!(的型(参));//移除常/共享等
静 如(是(T==串)){
写行("[!串006]",参);
}
异 静 如(是(T==整)){
写行("[!串007]",参);
}
异 静 如(是(T==极)){
写行("[!串008]",参);
}
});
对比c++版,
vs.
//C++
访问([](动&参){
用 T=退化型<推导(参)>;
如 常式(是相同值<T,串>){
打印格式("[!串009]",参.c串());
}
异 如 常式(是相同值<T,整>){
打印格式("[!串010]",参);
}
异 如 常式(是相同值<T,极>){
打印格式("[!串011]",参);
}
},v);
你选哪个?
浙公网安备 33010602011771号