2011-06-13 61 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, ...>>;