可以检索class.tupleof()项的名称吗?

时间:2013-03-14 10:30:40

标签: types tuples d

AnObject.tupleof 的结果中循环时,我可以将 size 作为字符串获取但是我可以获得更多元组项目(编辑)的高级信息,特别是原始数据名称(如源类中所写)?背景的想法是将此属性用作一种 RTTI

1 个答案:

答案 0 :(得分: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静态内省功率的小样本可能会更好用。

希望我这次能理解这个问题。