Templates 奇怪的行为;这个T",;

Templates 奇怪的行为;这个T",;,templates,d,typetraits,Templates,D,Typetraits,有人能给我解释一下下面的行为吗 使用这样的基类: abstract class Foo { string[] members; final: this(this T)(T child) { import std.conv : to; foreach (member; __traits(derivedMembers, T)) { mixin("members ~= to!string(ch

有人能给我解释一下下面的行为吗

使用这样的基类:

abstract class Foo
{
    string[] members;

    final:

    this(this T)(T child)
    {
        import std.conv : to;

        foreach (member; __traits(derivedMembers, T))
        {
            mixin("members ~= to!string(child." ~ member ~ ");\r\n");
        }
    }

    void printMembers()
    {
        writeln(members);
    }
}
我希望用传递的子类型的值填充成员

然而,这种行为真的很奇怪

数组成员将无限填充,这基本上会导致程序内存不足

如果将mixin更改为:

mixin("if (members.length < 20) members ~= to!string(child." ~ member ~ ");\r\n");
上述代码将产生如下输出:

["1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "f193.Bar", "f193.Bar", "f193.Bar", "f193.Bar", "f193.Bar", "f193.Bar", "f193.Bar", "f193.Bar", "f193.Bar"]
["100", "200", "300", "100", "200", "300", "100", "200", "300", "100", "200", "300", "100", "200", "300", "100", "200", "300", "100", "200", "f193.Baz", "f193.Baz", "f193.Baz", "f193.Baz", "f193.Baz", "f193.Baz"]
["1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "f193.Bar", "f193.Bar", "f193.Bar", "f193.Bar", "f193.Bar", "f193.Bar", "f193.Bar", "f193.Bar", "f193.Bar"]
在那里,我本可以期待类似这样的事情:

["1", "2"]
["100", "200", "300"]
["1", "2"]

它到底为什么会这样?在我看来,这似乎是一个bug,但可能有这样的行为的原因?

看看我看到的代码,这是因为构造函数被称为递归

简单的修复方法如下所示:

static if (member != "__ctor") mixin("members ~= to!string(child." ~ member ~ ");\r\n"); 
static if (member != "__ctor") mixin("members ~= to!string(child." ~ member ~ ");\r\n");