Checking for manifest constants

bogdan szabobogdan3 at gmail.com
Sat Mar 6 16:00:30 UTC 2021


On Friday, 5 March 2021 at 14:42:07 UTC, Petar Kirov [ZombineDev] 
wrote:
> On Friday, 5 March 2021 at 08:23:09 UTC, Bogdan wrote:
>> [...]
>
> I suggest this:
>
>     enum globalConfig = 32;
>     int globalValue = 22;
>     immutable globaImmutablelValue = 22;
>
>     enum isManifestConstant(alias symbol) =
>       __traits(compiles, { enum e = symbol; }) &&
>       !__traits(compiles, { const ptr = &symbol; });
>
>     unittest {
>       struct Test {
>         enum config = 3;
>         int value = 2;
>       }
>
>       static assert(isManifestConstant!(Test.config));
>       static assert(isManifestConstant!(mixin("Test.config")));
>
>       static assert(isManifestConstant!(globalConfig));
>       static assert(isManifestConstant!(mixin("globalConfig")));
>
>       static assert(!isManifestConstant!(Test.value));
>       static assert(!isManifestConstant!(mixin("Test.value")));
>
>       static assert(!isManifestConstant!(globalValue));
>       static assert(!isManifestConstant!(mixin("globalValue")));
>
>       static assert(!isManifestConstant!(globaImmutablelValue));
>       static 
> assert(!isManifestConstant!(mixin("globaImmutablelValue")));
>     }

Thanks!

I ended using this:
```

/// Check if a member is manifest constant
enum isManifestConstant(T, string name) = 
isManifestConstant!(__traits(getMember, T, name));

/// ditto
enum isManifestConstant(alias symbol) = __traits(compiles, { enum 
e = symbol; }) &&
   !__traits(compiles, { const ptr = &symbol; });

```

It looks like mixin does not work well with protected/private 
members


More information about the Digitalmars-d-learn mailing list