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

Reply via email to