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 ?