怎么做!string(enum.member)有效吗?

Jac*_*ack 5 d dmd

std.conv.to!string(enum.member)工作怎么样?一个函数如何获取枚举成员并返回其名称?它是使用编译器扩展还是类似的东西?自从我来自C/C++世界以来,这对我来说有点平常.

Ada*_*ppe 9

它的作用是使用枚举类型的编译时反射来获取成员列表(名称作为字符串)及其值.它根据此信息构造一个switch语句,以便快速查找以从值中获取名称.to!SomeEnum("a_string")使用相同的原理,只是在另一个方向.

访问编译时反射信息__traits(allMembers, TheEnumType),返回一个字符串列表,可以循环以构建switch语句.然后__traits(getMember, TheEnumType, memberName)用来取取身体.

可以在这里看到更多特征:http://dlang.org/traits.html#allMembers

那个allMembers适用于许多类型,不仅仅是示例中看到的类,还有结构,枚举等,甚至模块.

火卫一源代码有像一些例子EnumMembersstd.traits:https://github.com/D-Programming-Language/phobos/blob/master/std/traits.d#L3360

尽管phobos源很难读,但是在3399行,在该函数的底部,你可以看到它__traits(allMembers)作为它的数据源.std.conv.to是根据许多std.traits功能实现的.

您还可以查看示例章节选项卡,从我的D食谱中获取反射章节,该章节也讨论了这些内容:

http://www.packtpub.com/discover-advantages-of-programming-in-d-cookbook/book

该章的最后一个例子展示了如何使用几个反射功能来构建一个基于字符串的小函数调度程序.以下章节(虽然不是免费提供)展示了如何构建一个开关以提高效率.它实际上非常简单:只需将case语句放在foreach编译时数据中,然后D编译器将展开,然后为您优化查找表!