On Tuesday, 27 March 2018 at 23:34:20 UTC, arturg wrote:
On Tuesday, 27 March 2018 at 23:23:38 UTC, ag0aep6g wrote:

DMD might accept that, but I don't think it works in a meaningful way. How do you call the @system one?

Looks like the @safe one will always be called, even from @system code:

----
import std.stdio;

void talk() @system { writeln("@system"); }
void talk() @safe { writeln("@safe"); }

void main() @system
{
    talk(); /* Prints "@safe". */
}
----

you can call them with __traits(getOverloads, T, "name")[index];

you can overload on types attributes and linkage, but seems like you can only merge overloads based on types.

i have some templates which can be used like this:

type.dgAt!("name", index);
dgAt!("name", index, somemodule);
dgAt!("name", index, "somemodule");
alias fun = aAt!("name", index, someTypeOrModule);

type.dgOf!("name", void function(int)@safe);
dgOf!("name", void function(int)@safe, module);
dgOf!("name", void function(int)@safe, "module");

from!(type, "name").aAt!1;
from!(type, "name").aOf!(void function(int));
from!(type, "name").dgAt!1;
from!(type, "name").dgOf!(void function(int));

but this fails:
type.dgOf!("name", extern(C) void function(int)@safe);

and this works:
alias funtype = extern(C) void function(int)@safe;
type.dgOf!("name", funtype);

Reply via email to