On 15.12.2016 01:38, Basile B. wrote:
On Wednesday, 14 December 2016 at 22:06:35 UTC, Ali Çehreli wrote:On 12/14/2016 09:25 AM, Basile B. wrote: > On Tuesday, 13 December 2016 at 23:37:59 UTC, Timon Gehr wrote:>> 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)); When you do that, the code does not match the syntax of __traits(compiles). Putting the code inside a scope works at least in this case: enum Compiles2(string code) = __traits(compiles, mixin('{' ~ code ~ '}')); AliI see, it makes sense. Anyway the two templates have a common problem (protection attributes: data used in the code must be visible to the outside), so using them as a shortcut is a false good idea.
Shortcut that works:enum ifCompiles(string code)=`static if(__traits(compiles,{ `~code~` })){ `~code~` }`;
mixin(ifCompiles!q{ ... });
