Templates with scope
bauss
jj_1337 at live.dk
Wed Jul 21 10:08:10 UTC 2021
On Wednesday, 21 July 2021 at 09:06:52 UTC, Sönke Ludwig wrote:
> Am 21.07.2021 um 09:16 schrieb bauss:
>> 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.
>
> The symbol name is not available in the scope of the template,
> so that the `mixin(symbol.stringof)` doesn't work, but you can
> simply use the alias directly:
>
> template CanCompile(alias symbol)
> {
> enum CanCompile = __traits(compiles, { symbol = 10; });
> }
The problem is that I just saw I didn't describe my problem very
well, as I don't actually have the symbol at the given time.
I only had the symbol name and I use it to test if the symbol is
available because it comes from a __traits(allMembers) which
includes some symbols that makes it fail to compile if I try to
use the symbol directly without checking whether it compiles or
not.
And this was the exact template I was trying to use:
```d
template CanUseSymbol(string symbolName, string symbolAlias =
"symbol", string moduleAlias = "moduleImport")
{
enum CanUseSymbol = __traits(compiles, { mixin("alias " ~
symbolAlias ~ " = " ~ moduleAlias ~ "." ~ symbolName ~ ";"); });
}
```
For obvious reasons it doesn't work as you also mentioned, the
scope simply isn't available.
But I can't use alias unfortunately in this case.
I wish there was a way to return the symbols from allMembers,
instead of just the name of the symbols, that would solve this
problem.
More information about the Digitalmars-d
mailing list