2012-12-01 45 views
0

我正嘗試在C++中創建一個簡單的動態語言解釋器。我想能夠聲明動態類型數組,但我不確定如何將它們存儲在C++中的某個對象中。在C++中的vector/array中存儲不同類型的元素?

在Ruby/Python中,我可以存儲任何我想要的東西,但是在C++中這樣做的有效方式是什麼? (另外,如果有人有鏈接到簡單開放源碼詞法分析器/解析器/解釋器的動態語言,如Ruby,我會很感激鏈接)。

回答

1

您將不得不根據您的語言的語義推出一些自定義解決方案。例如,您可以使用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 

它很可能進一步優化這個方案,但不能進一步推廣它,因爲它已經是最廣泛的了。

+0

聽起來像是我得到的4個回答中最好的想法。我會試一試。謝謝 :) – user1527166

0

動態語言存儲通用對象的方式是通過指針,你可以在C++中做同樣的事情。存儲一個指向您在C++類中定義的通用「對象」的指針,這是一種有效的方法。

0

使用工會或動態地分配一個共同的基類型的對象(和經由dynamic_cast的或等效構建體向下轉換它們適當的)另一種方法是boost::variant,它允許編寫代碼,如:

typedef boost::variant<int, float, char, std::string> LangType; 
std::vector<LangType> langObjects; 

如果你的設計允許這樣的實現,這具有編譯時安全的優點,並且避免了使用堆,虛函數和多態downcast造成的任何懲罰。