I've made and exercise on variable number of parameters:
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)]
)
);
}
It works ok:
3.3
[4.3, 4.3, 4.3, 4.3]
Then I've tried to try overload function calculate and change calculate1 name to calculate. And it brings this errors:
(27): Error: declaration calculate is already defined
(38): Error: function calculate (const(Calculation) c) is not callable using argument types (Calculation[])
I can't get it. Is this kind of declaration brings ambiguity and compiler tries to send Calculation[] as Calculation argument? And is it possible to overload calculate function in this program?
EDIT: When removing ... from line double[] calculate(in Calculation[] ccs...){ ambiguity vanishes. Now having types Calculation[] and Calculation as arguments, error message is still the same.
EDIT2. Interesting find by rcorre. Moving overloaded function calculate from main to upper scope this overload totally works.