当我遇到一个有趣的问题时,我正在为 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!为什么?因为我必须假设它需要的所有成员都存在,除非我可以在运行时证明不存在——这为时已晚。所以程序试图调用front
,popFront
和empty
on result
,使我的程序崩溃。
我想不出办法来解决这个问题。有人有想法吗?