在运行时向对象添加任意类型

时间:2011-06-13 17:30:31

标签: c++ pointers void-pointers

在我们的应用程序中,我们有一个在运行时接收属性的对象。例如,要向对象添加浮点数:

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 *以及正确清理所需的额外注意力。有没有更好的方法在运行时在对象中存储任意类型,可以通过字符串映射访问,并且仍然可以通过析构函数自动清理?

3 个答案:

答案 0 :(得分:5)

你可以在这里选择 - boost :: any或只是将所有内容存储为std :: string都会立刻想到。

答案 1 :(得分:2)

这篇文章似乎是对你的问题的一个很好的答案。

Storing a list of arbitrary objects in C++

答案 2 :(得分:1)

不是将地图存储到这么多的值,最好使用boost :: variant。毕竟,通过你的界面来判断,将int和float分配给同一个字符串是不合法的。

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