On Monday, 9 July 2018 at 17:26:30 UTC, vino.B wrote:

Request Help:
void process(alias coRoutine, T...)(Array!string Dirlst, T params)
{
ReturnType!coRoutine rData; ///// This line is not working
      alias scRType = typeof(coRoutine(string.init, T.init));
      auto PFresult = taskPool.workerLocalStorage!scRType();
foreach (string FFs; parallel(Dirlst[],1)) { PFresult.get ~= coRoutine(FFs, params); }
      foreach(i; PFresult.toRange) { rData ~= i[][]; }
}

Error:
test.d(206): Error: template instance `std.traits.ReturnType!(coAgedDirClean)` does not match template declaration ReturnType(func...) if (func.length == 1 && isCallable!func)

Yeah... for ReturnType to work, you need a function, but you have only a template.

The easy solution is to execute the template and to ask the result for its type:

´´´
void main()
{
        process!fun();
}

void process(alias coRoutine, T...)(T params)
{
        auto res = coRoutine(params);
        pragma(msg, typeof(res));
}

auto fun(T...)(T params)
{
        return 42;
}
´´´

If you need it in advance... It is a little bit longer. There was a place, where I used this once...

See
https://run.dlang.io/is/Xy6Xf4

However, I wonder why you need this, especially as your process is void. Why not just using auto for results of the coroutines?

Reply via email to