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

| 在我们的应用程序中,我们有一个在运行时接收属性的对象。例如,向对象添加浮点数:
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;
哦,可怕的ed3ѭ。有时我们需要向该对象添加类或函数。我们没有为每种可能的类型都有单独的地图,而是选择了
void *
地图。我们遇到的问题是清理。当前,我们保留
void *
指向的这些“悬挂”对象的每种类型的列表,并在必要时在这些单独的列表上调用清除函数。 我不喜欢使用ѭ3以及正确清理所需的所有额外注意。有什么更好的方法可以在运行时将任意类型存储在对象中,可以通过字符串映射访问,并且仍然可以通过析构函数进行自动清理吗?     
已邀请:
        这篇文章似乎是对您问题的一个很好的答案。 在C ++中存储任意对象的列表     
        您在这里选择太多了-boost :: any或只是将所有内容存储为std :: string都立刻浮现在脑海。     
        与其将地图存储为如此多的值,不如使用boost :: variant。毕竟,从您的界面来看,将int和float都分配给同一字符串对我来说是不合法的。
std::map<std::string, boost::variant<float, int, std::string, ...>>;
    

要回复问题请先登录注册