| /* |
| TEST_OUTPUT: |
| --- |
| fail_compilation/ice12501.d(31): Error: function `ice12501.foo(int value)` is not callable using argument types `(int, int)` |
| fail_compilation/ice12501.d(31): expected 1 argument(s), not 2 |
| fail_compilation/ice12501.d(31): Error: function `ice12501.foo(int value)` is not callable using argument types `(int, int)` |
| fail_compilation/ice12501.d(31): expected 1 argument(s), not 2 |
| fail_compilation/ice12501.d(45): Error: template instance `ice12501.reduce!(foo, foo).reduce!(Tuple!(int, int), int[])` error instantiating |
| --- |
| */ |
| |
| struct Tuple(T...) |
| { |
| alias Types = T; |
| T field; |
| alias field this; |
| } |
| Tuple!A tuple(A...)(A args) { return typeof(return)(args); } |
| |
| template reduce(fun...) |
| { |
| auto reduce(Args...)(Args args) |
| { |
| alias seed = args[0]; |
| alias r = args[1]; |
| Args[0] result = seed; |
| for (; r.length != 0; r = r[1..$]) |
| { |
| foreach (i, Unused; Args[0].Types) |
| { |
| result[i] = fun[i](result[i], r[0]); |
| } |
| } |
| return result; |
| } |
| } |
| |
| int foo(int value) |
| { |
| return value; |
| } |
| |
| void main() |
| { |
| reduce!(foo, foo)(tuple(0, 0), [ 1 ]); |
| } |