我正在尝试构建一堆可以共享数据的对象,但不会相互耦合。我想要的是每个对象的字段对于他们需要的任何数据都是shared_ptr
。一旦创建了所有对象,这将满足我的所有需求,但我的问题是如何分发创建shared_ptr
所需的信息,因为类型可以是任何类型。
我将在工厂对象中一次创建共享一组数据的所有对象。此外,每个共享字段都有一个枚举条目来表示属性类型(不是数据类型)。例如,枚举将具有Position
的条目,并且需要位置信息的每个对象将使用枚举键入地图以查找创建shared_ptr
所需的信息。
我想从我的系统中得到的是:
SetEnum
传递给工厂,工厂定义要创建的对象的“集合”,以及定义对象集的初始数据的可选map<AttributeEnum, ??>
map<AttributeEnum, ??>
创建shared_ptr
作为每个对象中的字段。如果对象需要与特定值AttributeEnum
对应的字段,则它将从地图中提取其值。如果该值不是映射中的键,则它将使用默认值创建它,并将其添加到地图以供将来使用的对象使用。如果具有模板类型的方法有助于解决问题,则可以在构造期间或之后完成此步骤。问题是我在编译时需要错误,而不是运行时。如何将AttributeEnum
映射到某个类型?例如,与AttributeEnum
Position
值对应的每个字段都将具有类型shared_ptr<double>
,但如果我尝试将Position
与例如shared_ptr<int>
关联,则我想要编译错误std::map<Enum, shared_ptr<void> >
。我的问题是如何解决这个问题?
我想到的几个不同的系统(尽管它们都不能确保编译时的错误):
shared_ptr
并静态将AttributeEnum
投射到相应的类型。我正在考虑存储两个并行数据集,Position
具有条目#define POSITION double
,以及编译器常量将定义类型POSITION
,然后我只使用{{ 1}}对于我必须的类型,但这会使代码更难阅读。