如何获取枚举成员的值类型

时间:2015-12-26 08:27:26

标签: reflection enums d

例如

template EnumValueType(T)
if (is(T == enum))
{
    alias EnumValueType = /* ??? */;
}

enum E: ubyte {e0 = 123}
enum D: float {d0 = 0.5}

void main()
{
    E e;
    D d;
    assert( is(EnumValueType!(typeof(e)) == ubyte));
    assert( is(EnumValueType!(typeof(d)) == float));
}

到目前为止,我只能检测它是否是枚举。我看到了一种方法来做到这一点,但它很糟糕。它将包括迭代由D基本类型组成的 AliasSeq seq ,并查看 T 是否可转换为 seq [n] 。< / p>

还有其他想法吗?

1 个答案:

答案 0 :(得分:1)

您可能还需要std.traits.OriginalType

is返回第一个枚举基类型,可能是另一个枚举。 OriginalType继续扩展,直到获得实际的基本类型。

enum E : real { a }
enum F : E    { a = E.a }

static if(is(F Base == enum))
    pragma(msg, Base); // Prints "E"
else
    static assert(false);

import std.traits;
pragma(msg, OriginalType!F); // Prints "real"
相关问题