【发布时间】:2011-02-03 20:44:07
【问题描述】:
我将从一个会导致实际问题的上下文开始。
我正在尝试构建一个类,它的每个实例都将管理如何将数据绑定到对象中。 该类最好包含方法:
class DataManager {
Object CreateObject();
void DestoryObject();
template<typename DataType>
DataType* AddDataToObject(Object o)
template<typename DataType>
DataType* GetDataForObject(Object o)
template<typename DataType>
void RemoveDataFromObject(Object o)
};
上面代码中的对象只是一些标识符 - 在这一点上是 int 并且不包含任何数据或方法(这不应该改变)。上面使用的 DataType 基本上可以是任何类,但一般情况是这只是一个没有方法的结构。可用作 DataType 的完整列表在编译时是已知的,但不应对其进行编码,因为它经常更改。
我尝试实现的两个目标是: - 可维护性/速度 - 用户应该能够在不修改此代码的情况下添加新的 DataType 结构 - 速度 - 应该尽可能快:)
到目前为止,我最好的想法是创建一个容器类:
class ContainerBase;
template<typename DataType>
class DataTypeContainer : ContainerBase;
然后数据结构将类似于:
map< DataTypeType, map< Object, ContainerBase* > >
如何实现这一目标? boost::mpl::map 有帮助吗?
本质上应该可以这样做,因为所有 DataType 在编译时都是已知的。
【问题讨论】:
-
您在寻找从类型到值的映射吗?您希望该地图是全局的,还是需要多个实例?
-
@Jeremiah Willcock - 是的,最好从类型映射到值,不幸的是我需要多个实例。
-
我刚刚编辑了我的答案,为每种数据类型保留了一个从
void*到Object的全局映射(表示从类型到void*键的映射,表示映射实例到值)。不过,您可能需要考虑在一个包含所有成员列表的公共头文件中使用boost::fusion::map(甚至是struct);需要更新代码但将信息存储在一个地方。
标签: c++ templates boost types metaprogramming