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