2014-07-08 23 views
5

std.conv.to!string(enum.member)如何工作?函數如何獲取枚舉成員並返回其名稱?它使用編譯器擴展或類似的東西嗎?自從我來自C/C++世界以來,這對我來說有點通常。string(enum.member)是如何工作的?

回答

8

它所做的是對enum類型使用編譯時反射來獲取成員列表(名稱作爲字符串)及其值。它從這些信息中構造一個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

雖然火衛一源是有點兒難懂,但線3399,在該函數的底部,則可以使用__traits(allMembers)照見其數據源。根據許多std.traits函數實現了std.conv.to

您還可以檢查出樣章選項卡以獲取反射章我的d食譜這也討論了這個東西:

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

在該章的最後一個例子說明如何使用幾個基於字符串構建一個小函數調度程序的反射功能。下面的章節(不是免費提供)顯示瞭如何從中創建一個轉換器以提高效率。這實際上很簡單:只要將case語句放在編譯時數據的foreach內,D編譯器就會展開,然後爲您優化查找表!