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