當我遇到一個有趣的問題時,我正在爲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'中的任何內容都不允許這樣做。 –