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");