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

sin*_*oth 2 c++ pointers void-pointers

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

my_object->f("volume") = 1.0f;
Run Code Online (Sandbox Code Playgroud)

检索卷的工作方式相同:

cout << my_object->f("volume") << endl;
Run Code Online (Sandbox Code Playgroud)

在内部,这由字符串映射到它们各自的类型.每种类型都有自己的访问方法和地图.它看起来像这样:

map<string, float> my_floats;
map<string, int> my_ints;
map<string, void *> my_void_pointers;
Run Code Online (Sandbox Code Playgroud)

哦,可怕的void *.有时我们需要向对象添加类或函数.我们没有为每种可能的类型设置单独的地图,而是选择了void *地图.我们遇到的问题是清理.目前,我们保留了void *指向这些"悬空"对象的每种类型的列表,并在必要时在这些单独的列表上调用清理函数.

我不喜欢必须使用void *它以及正确清理所需的所有额外注意力.有没有更好的方法在运行时在对象中存储任意类型,可以通过字符串映射访问,并仍然可以通过析构函数自动清理?

小智 5

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