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