I have a template function `fImpl` I whish to instantiate manually using the new name `f`. Reason is simple: `f` should not be a template, but overloading it makes it easier that way.
Nothing's more simple in D:

    int fImpl(T)(T value) { return cast(int) value; }
    alias f = fImpl!int;
    alias f = fImpl!long;

It works perfectly used like that.

In my case, `T` isn't just a simple type, it's a delegate type. So it's rather like this:

    alias BaseDG = int delegate(ref int);
    int fImpl(DG : BaseDG)(scope DG callback)
    {
        // NB: this is @safe iff callback is @safe
        int x = 0;
        return callback(x);
    }

    alias myDG = int delegate(ref int) @safe;
    alias f = fImpl!myDG;

When I ask the compiler, if `f` is @safe, it tells me: Hurray, it is!

pragma(msg, __traits(getFunctionAttributes, f)); // tells me: `f` is @safe

For whatever reason, when I put the code in a struct, the @safe testing line tells me, it's @system now.

    struct S
    {
        // static: // static or not does not matter

        alias BaseDG = int delegate(ref int);
        int fImpl(DG : BaseDG)(scope DG callback) { return 0; }

        alias myDG = int delegate(ref int) @system;
        alias f = fImpl!myDG;

pragma(msg, __traits(getFunctionAttributes, f)); // tells me: `f` is @system
    }

I have no idea why. It is irrelevant if the function template is `static` or even does not call the callback.

Reply via email to