的可變數目我做了和鍛鍊上的參數變量數:函數重載和參數
import std.stdio;
void main() {
enum Operation { add, subtract, multiply, divide }
struct Calculation {
Operation op;
double first;
double second;
}
double calculate1(in Calculation c) {
double result;
switch (c.op) {
case Operation.add : {
result = c.first+c.second;
break;
}
default : {
break;
}
}
return result;
}
double[] calculate(in Calculation[] ccs...){
double[] result;
foreach(c;ccs){
result ~= calculate1(c);
}
return result;
}
writeln(calculate1(Calculation(Operation.add, 1.1, 2.2)));
writeln(calculate
([Calculation(Operation.add, 2.1, 2.2)
,Calculation(Operation.add, 2.1, 2.2)
,Calculation(Operation.add, 2.1, 2.2)
,Calculation(Operation.add, 2.1, 2.2)]
)
);
}
它的工作原理確定:
3.3
[4.3, 4.3, 4.3, 4.3]
然後我試圖嘗試過載功能calculate
並將calculate1
名稱更改爲calculate
。它帶來了這個錯誤:
(27): Error: declaration calculate is already defined
(38): Error: function calculate (const(Calculation) c) is not callable using argument types (Calculation[])
我無法得到它。這種聲明是否會帶來模糊性,編譯器會嘗試將Calculation []作爲計算參數?在這個程序中是否有可能超載calculate
函數?
編輯:當從行double[] calculate(in Calculation[] ccs...){
刪除...
歧義消失。現在將類型和Calculation
作爲參數,錯誤消息仍然相同。
EDIT2。 rcorre有趣的發現。將超載函數calculate
從main
更改爲範圍上限,此重載完全有效。
編輯:我錯了有關過載無效。這是一個(令人驚訝的是)有效的重載,只要它沒有聲明_inside_另一個函數(在這種情況下,'main') – rcorre
確實。這是有效的超載。將刪除我的答案。 – sigod
交互查找。我會更新關於它的文本。 – Rijk