On 06/27/2016 06:41 PM, Smoke Adams wrote:
I have a type

public class SuperFunction(T)
{
   T t;
   return(T) Do() { return t(); }
}

where T is a delegate or function. First, I would like to be able to
specify that this must be the case for SuperFunction so we can't pass
non-function/delegates for T. Second, How to specify the return type of
Do to match that of T.

e.g., SuperFunction!(bool function())

then return(T) should be bool.

The simplest thing is to define the return type as 'auto'.


Similarly, I would like to extra the T's parameters and make Do have
them also.

This way, SuperFunction!T.Do emulates T in every way.



std.traits is your friend. :)

import std.traits;

public class SuperFunction(alias func)
        if (isCallable!func) {
    auto Do(Parameters!func args) { return func(args); }
}

void main() {
    auto sf = new SuperFunction!((int i) => i * 2);
    assert(sf.Do(42) == 84);
}

Ali

Reply via email to