是否有可能在編譯時和運行時起作用的函數?在編譯時和運行時起作用的函數
我想創建一個函數,它以一個任意的順序接受整數和浮點數,然後逐個求和。
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
什麼是調用這些函數應該看起來像? –
增加了兩個示例函數調用 –