2011-06-13 64 views
2

在我們的應用程序中,我們有一個在運行時接收屬性的對象。例如,爲float添加到對象:在運行時向對象添加任意類型

my_object->f("volume") = 1.0f; 

檢索體積的工作方式相同:

cout << my_object->f("volume") << endl; 

在內部,這是通過地圖串到它們各自的類型來表示。每種類型都有自己的訪問方法和地圖。它看起來像這樣:

map<string, float> my_floats; 
map<string, int> my_ints; 
map<string, void *> my_void_pointers; 

哦,可怕的void *。有時我們需要爲對象添加類或函數。我們沒有爲每個可能的類型都有單獨的地圖,而是在void *地圖上定居。我們遇到的問題是清理。目前,我們圍繞着void *所指向的每個類型的「懸掛」對象列表,並在必要時在這些單獨的列表上調用清除函數。

我不喜歡不得不使用void *以及它需要進行適當清理的所有額外注意。有沒有更好的方法在運行時將任意類型存儲在對象中,可以通過字符串映射訪問,還可以通過析構函數自動清理嗎?

+0

你看過[boost :: any](http://www.boost.org/doc/libs/1_40_0/doc/html/boost/any.html)類型嗎? – GWW 2011-06-13 17:35:15

+0

還沒有。感謝鏈接GWW。我承認,我不太熟悉提升技術 - 如果您不確定要查找什麼,圖書館有點嚇人! – sinoth 2011-06-13 17:48:41

+0

我同意那裏的文檔肯定會更好 – GWW 2011-06-13 18:37:40

回答

5

你被寵壞了,在這裏選擇 - boost :: any或簡單地將所有東西都存儲爲std :: string都會立刻想起來。

+0

'boost :: any'肯定是在這裏贏了。 – Puppy 2011-06-13 17:42:33

+0

@DeadMG取決於 - 也許你不想依賴。 – 2011-06-13 17:45:00

+0

@Neil你可以通過將所有內容存儲爲std :: string來解釋你的意思嗎?你的意思是將該類型存儲爲一個字符串,然後再檢查該字符串是否與已知類型列表相對應並作出相應的反應? – sinoth 2011-06-13 17:46:30

1

而不是存儲映射到這麼多的價值,這將是更好地使用一個boost ::變種。畢竟,根據你的接口判斷,把int和float分配給同一個字符串是不合法的。

std::map<std::string, boost::variant<float, int, std::string, ...>>;