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 ?

Reply via email to