我正在尝试构建一堆可以共享数据但彼此不耦合的对象。我想要的是让每个对象的字段成为shared_ptr
他们需要的任何数据。一旦创建了所有对象,这将满足我的所有需求,但我的问题是如何分发创建shared_ptr
's 所需的信息,因为类型可以是任何东西。
我将在工厂对象内创建所有共享一组数据的对象。此外,每个共享字段都有一个枚举条目来表示属性类型(不是数据类型)。例如,枚举将有一个条目,Position
每个需要位置信息的对象都将使用枚举键入地图以查找创建shared_ptr
.
我想从我的系统中得到的是:
- 将 an 传递
SetEnum
给工厂,它定义要创建的对象“集”,以及map<AttributeEnum, ??>
定义对象集的初始数据的可选项 - 创建必要的对象,使用 a
map<AttributeEnum, ??>
创建shared_ptr
作为每个对象中的字段。如果对象需要一个与 的特定值对应的字段AttributeEnum
,它将从映射中提取其值。如果该值不是映射中的键,它将使用默认值创建它,并将其添加到映射中以供将来的对象使用。如果具有模板类型的方法有助于解决问题,则可以在构造期间或之后完成此步骤。
问题是我希望在编译时出现错误,而不是运行时。如何映射AttributeEnum
到类型?例如,与 的AttributeEnum
值相对应的每个字段都Position
将具有 type shared_ptr<double>
,但如果我尝试关联Position
,例如,我想要一个编译错误shared_ptr<int>
。我的问题是如何解决这个问题?
我想到了几个不同的系统(尽管它们都不能确保编译时的错误):
- 传递 a
std::map<Enum, shared_ptr<void> >
和 static 将shared_ptr
's 转换为适当的类型。 - 构造对象,然后遍历枚举,检查每个对象需要哪些属性,然后将正确的指针传递给它。
- 让一个对象“拥有”每个属性,并强制另一个对象通过消息传递系统获取信息。
我正在考虑存储两组并行数据,即AttributeEnum
具有条目Position
和编译器常量,它们将定义诸如 之类的类型#define POSITION double
,然后我将简单地POSITION
用于我必须使用的类型,但这会使代码更难阅读。