在我们的应用程序中,我们有一个在运行时接收属性的对象。例如,为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 *
以及它需要进行适当清理的所有额外注意。有没有更好的方法在运行时将任意类型存储在对象中,可以通过字符串映射访问,还可以通过析构函数自动清理吗?
你看过[boost :: any](http://www.boost.org/doc/libs/1_40_0/doc/html/boost/any.html)类型吗? – GWW 2011-06-13 17:35:15
还没有。感谢链接GWW。我承认,我不太熟悉提升技术 - 如果您不确定要查找什么,图书馆有点吓人! – sinoth 2011-06-13 17:48:41
我同意那里的文档肯定会更好 – GWW 2011-06-13 18:37:40