我正嘗試在C++中創建一個簡單的動態語言解釋器。我想能夠聲明動態類型數組,但我不確定如何將它們存儲在C++中的某個對象中。在C++中的vector/array中存儲不同類型的元素?
在Ruby/Python中,我可以存儲任何我想要的東西,但是在C++中這樣做的有效方式是什麼? (另外,如果有人有鏈接到簡單開放源碼詞法分析器/解析器/解釋器的動態語言,如Ruby,我會很感激鏈接)。
我正嘗試在C++中創建一個簡單的動態語言解釋器。我想能夠聲明動態類型數組,但我不確定如何將它們存儲在C++中的某個對象中。在C++中的vector/array中存儲不同類型的元素?
在Ruby/Python中,我可以存儲任何我想要的東西,但是在C++中這樣做的有效方式是什麼? (另外,如果有人有鏈接到簡單開放源碼詞法分析器/解析器/解釋器的動態語言,如Ruby,我會很感激鏈接)。
您將不得不根據您的語言的語義推出一些自定義解決方案。例如,您可以使用boost::any
至商店任何對象,但無法執行名稱查找等操作。一些彙編程序的知識在這裏很有用,因爲你基本上正在模擬這個。大多數人做的是一樣的東西
struct Object {
boost::any cppobject;
std::unordered_map<std::string, std::function<void(boost::any&, std::vector<boost::any>&)> funcs;
};
std::vector<Object> stuff;
時,在假想的語言,你有什麼樣
stuff[0].hi();
然後你就可以將其轉換成類似
std::vector<boost::any> args;
// fill args
stuff.at(0).funcs["hi"](stuff.at(0).cppobject, args);
// now args holds the result
它很可能進一步優化這個方案,但不能進一步推廣它,因爲它已經是最廣泛的了。
動態語言存儲通用對象的方式是通過指針,你可以在C++中做同樣的事情。存儲一個指向您在C++類中定義的通用「對象」的指針,這是一種有效的方法。
使用工會或動態地分配一個共同的基類型的對象(和經由dynamic_cast的或等效構建體向下轉換它們適當的)另一種方法是boost::variant,它允許編寫代碼,如:
typedef boost::variant<int, float, char, std::string> LangType;
std::vector<LangType> langObjects;
如果你的設計允許這樣的實現,這具有編譯時安全的優點,並且避免了使用堆,虛函數和多態downcast造成的任何懲罰。
聽起來像是我得到的4個回答中最好的想法。我會試一試。謝謝 :) – user1527166