Stefan 在研究类型函数.d作者在研究加速模板元编程及所有权/借贷
关系.Steven 勾勒出std2设计
亚当的:
module typegame.solution;
string easy(T...)() {
string result;//分开显示名与看见名,用于细分
string lastDisplay;
string lastSeen;
int repetitionCount;
void finish() {//完成
if(repetitionCount != 2 && repetitionCount != 3)
return;
if(result.length)result ~= " ";
if(repetitionCount == 2)
result ~= "double ";
else
result ~= "triple ";
result ~= lastDisplay;
}//函数中带函数
foreach(t; T) {//T
if(t.mangleof == lastSeen) {
repetitionCount++;
} else {
finish();
lastSeen = t.mangleof;
lastDisplay = t.stringof;
repetitionCount = 1;
}//就是个`流`序列处理.
}
finish();return result;
}
pragma(msg, easy!(int, int, uint, uint, uint));
pragma(msg, easy!(char, char, wchar, dchar, dchar));
stefan:
alias type = __type;
type[] makeTypeArray(type[] types ...){
return types;
}//类型数组
import std.algorithm;
enum type[] types = makeTypeArray(int, uint, long, ulong);
enum size4 = types.filter!((type a) { return a.sizeof == 4; } );//过滤类型
pragma(msg, () {
type[] result = [];
foreach(t;size4)result ~= t;
return result;
}().tupleof);
// 输出:tuple((int), (uint))
opAssign
不是用于初化
,而是为子序列赋值
.
构造函数中的第1次
赋值不变量,可当作赋值.第2次就不能改了.奇怪的是在未初化
成员上调用方法,导致初化
它.λ
有两种形式,普通函数仅一种,这是不一致.
应该让{}
过时,而用(){}
重写
`=> ...;`为`{ return ...; }`
还得消除=> {return expr;}
的歧义.
struct v
{
static int foo;
}
1(v) => v.foo;
,这是模板v
的foo
.
2auto x(v) => v.foo;
,这是函数v参数
的foo
.(v) => _x + v;
,无类型,表明这是模板
.