DRY version of `static if(__traits(compiles, expr)) fun(expr)`

Basile B. via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Dec 14 09:25:19 PST 2016


On Tuesday, 13 December 2016 at 23:37:59 UTC, Timon Gehr wrote:
> On 14.12.2016 00:00, Timothee Cour via Digitalmars-d-learn 
> wrote:
>> what's the best (and DRY) way to achieve:
>>
>> ```
>> static if(__traits(compiles, expr))
>>   fun(expr);
>> ```
>>
>> ie, without repeating the expression inside expr?
>>
>> eg:
>>
>> ```
>> static if(__traits(compiles, foo.bar[2])){
>>   counter++;
>>   writeln(" expr = ", foo.bar[2]);
>> }
>>
>> ```
>>
>
> I usually do
>
> enum code = q{expr};
> static if(__traits(compiles,mixin(code)))
>     fun(mixin(code));

Strangely if i put this in a templated enum that doesn't work.
If instead i use a delegate literal it works.

enum Compiles(string code) = is(typeof((){mixin(code);}));

enum Compiles2(string code) = __traits(compiles, mixin(code));

unittest
{
     static assert(Compiles!q{auto a = 1+1;});
     static assert(!Compiles!q{1;});
     static assert(!Compiles!q{a = 1;});

     static assert(Compiles2!q{auto a = 1+1;});
     static assert(!Compiles2!q{1;});
     static assert(!Compiles2!q{a = 1;});
}

wtf ?


More information about the Digitalmars-d-learn mailing list