Is there a way to make this logic work without using a mixin template.
I'd prefer if using a plain template was possible, rather than using a mixin template, because it introduces some extra boilerplate.
template CanCompile(alias symbol)
{
enum CanCompile = __traits(compiles, { mixin(symbol.stringof ~ " = 10;"); });
}
mixin template CanCompile2(alias symbol)
{
enum couldCompile = __traits(compiles, { mixin(symbol.stringof ~ " = 10;"); });
}
void main()
{
int x = 20;
// Fails:
static if (CanCompile!x)
{
x = 10;
}
// Okay:
mixin CanCompile2!x;
static if (couldCompile)
{
x -= 10;
}
writeln(x); // Output: 10
}
If it was possible to do it like this:
static if (mixin CanCompile2!x)
{
x -= 10;
}
Then it wouldn't be a problem, but unfortunately it's not.
I know why the template fails, so I'm not looking for the reasoning behind it, but is there not a way to avoid using mixin templates because I don't want to introduce a variable into the scope and I want to keep the code as short as possible.
Basically my use-case is just to test if certain expressions are possible in the current scope based on a given symbol, but I'd want to just test it in a static if statement.
I'm aware that I can just put the __traits(compiles) directly into the code, but what I'm trying to achieve here is a wrapper around that so I don't have some ugly boilerplate code.