gpt4 book ai didi

c++ - C++ 中的类型映射

转载 作者:行者123 更新时间:2023-12-01 15:03:37 26 4
gpt4 key购买 nike

我将从一个会导致实际问题的上下文开始。

我正在尝试构建一个类,其每个实例都将管理数据如何绑定(bind)到对象中。
该类最好包含方法:

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* > >

母 pig 怎么能做到这一点?
boost::mpl::map 会有所帮助吗?

本质上,这应该是可能的,因为所有 DataType 在编译时都是已知的。

最佳答案

class DataManager {
struct internal_base { virtual ~internal_base() {} };
template<typename T> struct internal_data : public internal_base {
T t;
};
boost::unordered_map<Object, boost::unordered_map<std::string, boost::unique_ptr<internal_base>>> data;
public:
Object CreateObject() { return Object(); }
void DestroyObject(Object o) { data.erase(o); }

template<typename DataType> DataType* AddDataToObject(Object o, std::string name) {
internal_data<T>* ptr = new internal_data<T>();
data[o][name] = ptr;
return &ptr->t;
}

template<typename DataType> DataType* GetDataForObject(Object o, std::string name) {
internal_base* ptr = data[o][name].get();
if (internal_data<DataType>* dptr = dynamic_cast<internal_data<DataType>*>(ptr)) {
return &dptr->t;
else
return 0;
}

void RemoveDataFromObject(Object o, std::string name) {
data[o][name] = 0;
}
};

这段代码做了一些假设——比如 Object 类型的默认构造,并且它是可散列的。但是修改起来应该不会太难。如果您只希望每种类型的一个数据成员与特定对象关联,那么获得定义的行为会非常棘手,因为您不能依赖 RTTI 为每个可能的 DataType 返回唯一名称。

关于c++ - C++ 中的类型映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4891511/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com