The following code does not compile:
void all(string file = __FILE__, size_t line = __LINE__)(void delegate()[] dgs ...)
{
foreach (dg; dgs)
{
dg();
}
}
void main()
{
all(
assert(true),
);
}
Error: template all cannot deduce function from argument types !()(void), candidates are:
all(string file = __FILE__, ulong line = __LINE__)(void delegate()[] dgs...)
Workaround: call `all!()(...)` instead of `all(...)`.
Comment #1 by ag0aep6g — 2016-08-01T10:55:01Z
For reference, the spec describes lazy variadic functions here:
http://dlang.org/spec/function.html#lazy_variadic_functions
The test case doesn't need the template parameters to fail. This fails, too:
----
void all()(void delegate()[] dgs ...) {}
void f() {}
void main() { all(f()); } /* Error: template test.all cannot deduce function from argument types !()(void) */
----
It works when the return type is int or another primitive type, including pointers and arrays:
----
void all()(int delegate()[] dgs ...) {}
int f() { return 0; }
void main() { all(f()); } /* no error */
----
But it fails with Object and user-defined aggregates. Most peculiarly, it also fails with an alias to a primitive type:
----
alias T = int;
void all()(T delegate()[] dgs ...) {}
T f() { return T.init; }
void main() { all(f()); } /* Error: template test.all cannot deduce function from argument types !()(int) */
----
Comment #2 by robert.schadek — 2024-12-13T18:49:21Z