是否有可能在编译时和运行时起作用的函数?在编译时和运行时起作用的函数
我想创建一个函数,它以一个任意的顺序接受整数和浮点数,然后逐个求和。
static template IsSame(T){
static template As(alias t){
enum As = is(T == typeof(t));
}
}
template staticFold(alias Func, alias B,Ts...){
static if(Ts.length == 0){
alias staticFold = B;
}
else static if(Ts.length == 1){
alias staticFold = Func!(B,Ts[0]);
}
else{
alias staticFold = staticFold!(Func,Func!(B,Ts[0]),Ts[1..$]);
}
}
template Sum(alias A, alias B){
alias Sum = AliasSeq!(A + B);
}
template SumIntFloat(Ts...){
alias IntSum = staticFold!(Sum,0,Filter!(IsSame!int.As,Ts));
alias FloatSum = staticFold!(Sum,0.0f,Filter!(IsSame!float.As,Ts));
}
它很好用,但它似乎只在编译时工作。如果我想在运行时调用这个函数呢?
void SumIntFloatV2(Ts...)(Ts ts){
alias Ints = Filter!(IsSame!int.As,ts);
foreach(i;Ints){
writeln(i);
}
}
这也适用于并打印所有传递给该函数的整数。
但是,如果我尝试使用staticFold
,它会失败。
void SumIntFloatV3(Ts...)(Ts ts){
alias Ints = Filter!(IsSame!int.As,ts);
alias IntSum = staticFold!(Sum,0,Ints);
writeln(Intsum);
}
实例函数调用:
SumIntFloatV3!(1,1.0,2,3,2.0,3.0);
SumIntFloatV3!(1,1,2,3,1.0,2.0);
相关:http://stackoverflow.com/q/31781188/944911 – sigod
什么是调用这些函数应该看起来像? –
增加了两个示例函数调用 –