在我们的应用程序中,我们有一个在运行时接收属性的对象。例如,要向对象添加浮点数:
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 :(得分:5)
你可以在这里选择 - boost :: any或只是将所有内容存储为std :: string都会立刻想到。
答案 1 :(得分:2)
这篇文章似乎是对你的问题的一个很好的答案。
答案 2 :(得分:1)
不是将地图存储到这么多的值,最好使用boost :: variant。毕竟,通过你的界面来判断,将int和float分配给同一个字符串是不合法的。
std::map<std::string, boost::variant<float, int, std::string, ...>>;