On 10/18/2012 06:34 PM, drpepper wrote:
> Thank you Ali,
>
> Indeed, I originally had the function outside of main.
>
> I have found another strange result with std.concurrency:
>
> spawn(&function, array[0].length, array.length);
> // generates compiling error: "cannot deduce template function
> from arg types"
>
> //Yet,
> int var_one = array[0].length;
> int var_two = array.length;
> spawn(&function, var_one, var_two);
> // compiles and runs

Reduced code:

void bar(T...)(void function(T) fn, T args)
{}

void foo(size_t i)
{}

void main() {
    bar(&foo, 42);    // <-- compilation error
}

std.concurrency.spawn has the same signature as bar. The problem is with that signature: It requires that the arguments must match the parameters of the function.

Changing the signature of spawn() to the signature of the following bar() should work:

void bar(Func, T...)(Func fn, T args)
    if (__traits(compiles, fn(args)))
{}

void foo(size_t i)
{}

void main() {
    bar(&foo, int.init);      // <-- now compiles
    bar(&foo, size_t.init);
}

I wonder whether others see any weakness in that signature. If not, it can be entered to bugzilla as an enhancement request.

Ali

Reply via email to