当我遇到一个有趣的问题时,我正在为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
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是writeln尝试使用编译时反射来弄清楚如何对待result.
它尝试的第一件事是什么? isInputRange!(typeof(result))
麻烦的是,它返回真实!为什么?因为我必须假设它所需要的所有成员都存在,除非我能在运行时证明这一点 - 这为时已晚.因此,该程序试图调用front,popFront以及empty上result,撞毁我的程序.
我想不出办法解决这个问题.有没有人有想法?