如何获取枚举成员的值类型
How can I get the value type of an enum member
例如
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].
还有其他想法吗?
您可以使用 is expression 的多个版本之一:
enum E : float
{
E1 = 2.0
}
static if (is(typeof(E.E1) Base == enum))
{
pragma(msg, Base); // float
}
您想要的模板的实现可能如下所示:
template EnumValueType(T)
if (is(T == enum))
{
static if (is(T Base == enum))
alias EnumValueType = Base;
}
您可能还想要 std.traits.OriginalType
。
is
returns 第一个枚举基类型,可能是另一个枚举。 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"
例如
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].
还有其他想法吗?
您可以使用 is expression 的多个版本之一:
enum E : float
{
E1 = 2.0
}
static if (is(typeof(E.E1) Base == enum))
{
pragma(msg, Base); // float
}
您想要的模板的实现可能如下所示:
template EnumValueType(T)
if (is(T == enum))
{
static if (is(T Base == enum))
alias EnumValueType = Base;
}
您可能还想要 std.traits.OriginalType
。
is
returns 第一个枚举基类型,可能是另一个枚举。 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"