当我遇到一个有趣的问题时,我正在为D实现一个动态类型库。在静态类型语言D中使用动态类型输入
现在,我成功地创建了一个名为dynamic()
的函数,该函数返回对象的动态版本。
例如:
import std.stdio, std.dynamic.core;
class Foo
{
string bar(string a) { return a ~ "OMG"; }
int opUnary(string s)() if (s == "-") { return 0; }
}
void main(string[] argv)
{
Dynamic d = dynamic(new Foo());
Dynamic result = d.bar("hi");
writeln(result); // Uh-oh
}
我整个运行的问题是,writeln
尝试使用编译时反射弄清楚如何对待result
的事实。
它尝试的第一件事是什么? isInputRange!(typeof(result))
问题是,它返回true!为什么?因为我必须假设它需要的所有成员都存在,除非我能在运行时证明,否则这太迟了。所以程序试图在result
上调用front
,popFront
和empty
,导致我的程序崩溃。
我想不出一种解决方法。有人有想法吗?
'std.variant'不支持具有任意字段类型。 –
@cyber你是什么意思? –
OP想要创建一个对象,其中'obj.anything'在编译时有效(即使它在运行时可能不是有效的)。正如我所见,'std.variant'中的任何内容都不允许这样做。 –