Static if a Function Exists

Jonathan Levi catanscout at gmail.com
Sun Apr 5 04:41:19 UTC 2020


On Friday, 3 April 2020 at 07:08:03 UTC, WebFreak001 wrote:
> maybe not the optimal solution because stringof isn't properly 
> defined, but currently I don't think there is a better way than:
>
> template matchesTemplateConstraints(alias fn, Args...)
> {
>     enum def = fn.stringof;
>     // private void testFun(string op, T)(Cls a, T b) if 
> (isNumeric!T) {}
>     mixin("private void testFun" ~ def[def.indexOf('(') .. $] ~ 
> " {}");
>
>     enum matchesTemplateConstraints = __traits(compiles, 
> testFun!Args);
> }
>
> void main()
> {
>     // true
>     pragma(msg, matchesTemplateConstraints!(opBinaryImpl, "+", 
> int));
>
>     // false
>     pragma(msg, matchesTemplateConstraints!(opBinaryImpl, "+", 
> string));
> }
>
> You can also static foreach over __traits(getOverloads, 
> mixin(__MODULE__), "opBinaryImpl", true) if you have multiple 
> templates of same name

I will try that out, thanks.  I do have overloads, and somehow I 
missed the existence of `__traits(getOverloads)`.


Ah, I see, take the string of the function code (didn't know you 
could do that...) and create a local duplicate without the body 
included.  Hacky, but a workable solution if D does not have 
anything better.




More information about the Digitalmars-d-learn mailing list