2013-03-14 52 views
1

當在AnObject.tupleof結果循環,我可以得到大小作爲一個字符串,但我可以在元組項目(編輯),特別是原來的數據名字來取得更先進的相關信息(如源文件中所寫)?背景的想法是將此屬性用作RTTI可以檢索class.tupleof()項目的名稱嗎?

+0

你需要什麼樣的信息? 您可以使用std.traits.FieldTypeTuple模板作爲靜態數組,您可以使用foreach循環。 – yaz 2013-03-14 11:20:38

+0

我需要原始數據名稱 – babu67 2013-03-14 14:41:23

+0

您是否通過「原始數據名稱」表示實際變量/對象名稱?你想在OT的情況下獲得「AnObject」字符串? – DejanLekic 2013-03-16 11:54:25

回答

2

.tupleof返回值元組這是不足以獲得字段名稱。也沒有「數據名稱」這樣的東西,因爲D在數據(==值)和字段名稱之間沒有任何關係,它只是以其他方式存在。

一些內置的特質可以幫助雖然:

module test; 

class Experiment 
{ 
    class Nested 
    { 
    } 

    Nested nested; 
    int plain; 
    void delegate() skipped; 
} 

import std.traits : isCallable, fullyQualifiedName; 
import std.typetuple : Filter; 

template allFields(alias T) 
{ 
    private template combinedFilter(string name) 
    { 
     // filter out nested type definitions and methods 
     // side effect: will filter out delegate/function pointer fields, don't know if listing those makes sense 
     mixin("alias field = " ~ fullyQualifiedName!T ~ "." ~ name ~ ";"); 
     enum combinedFilter = !is(field) && !isCallable!field; 
    } 

    alias allFields = Filter!(combinedFilter, __traits(allMembers, T)); 
} 

void main() 
{ 
    pragma(msg, allFields!Experiment); 
} 

你可以用與此DPaste飛這個代碼實驗。

也許有一個更簡單的解決方案,但考慮到你的問題的措辭,大多數通用的方法和D靜態內省電源的小樣本可能會更好地使用。

希望我這個時候已經理解了這個問題。

+0

在我的問題中有一個錯誤,遇到的問題也是檢索每個元素的名稱,如實驗類中所寫,所以* a *和* NestedBase *。否則你的答案是有效的。 elem.stringof返回元素... – babu67 2013-03-14 14:39:24

+0

編輯:新的答案 – 2013-03-14 16:57:59

相關問題