1

AnObject.tupleofの結果をループすると、サイズまたはを文字列として取得できますが、タプルアイテム(編集)、特に元のデータ名(ソースクラスに記述されている)に関するより高度な情報を取得できますか?背景のアイデアは、このプロパティを一種のRTTIとして使用することです。

4

1 に答える 1

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 静的イントロスペクション能力の小さなサンプルがより適切に使用される可能性があります。

今回は質問を正しく理解できたと思います。

于 2013-03-14T12:06:47.093 に答える