将一组指向基类的指针转换为一组指向其模板化派生类的指针

时间:2018-10-11 22:40:06

标签: c++ casting derived-class

我想将项目存储在某种类型的自定义内存数据库中。

要做到这一点,我想使用一个映射,该映射的键是要存储的值的type_index,并且其值是存储要存储的值的模板化子类的std :: set。讲解可能比说出更简单:

我的基类称为ItemBase

子类是这样的:

template<class T>
class Item : public ItemBase {

    // ...
    T stored_item;  
    // ...

};

我的class Database具有以下内容:

typedef std::set<ItemBase*> ItemList;

template <typename T>
using DefinedItemList = std::set<Item<T>*>;

typedef std::unordered_map<std::type_index, ItemList> MapOfItemLists;

// ...

MapOfItemLists itemsByType;

保存项目时,我使用以下功能进行存储:

template<typename T> Item<T>* Database::add_item(T item) {

    Item<T>* pItem = new Item<T>(item,this);

    if(!item_type_exists(typeid(T)))
        itemsByType[typeid(T)] = ItemList();

    itemsByType[typeid(T)].insert(pItem);

    return pItem;
}

也就是说,我遇到的问题是尝试检索具有原始模板化子类类型的具体类型的列表时。

由于对象可以接受任何类型,因此我无法预定义类型,因此我将它们保存在ItemBase*组中。但是如何恢复Item<T>*的集合呢?

我试图做这样的演员:

ItemList ret = itemsByType.find(type_index)->second;
return dynamic_cast<DefinedItemList<T>&>(ret);

但这给了我这个错误:

 error: cannot dynamic_cast ‘ret’ (of type ‘ItemList {aka class std::set<ItemBase*>}’) to type ‘DefinedItemList<int>& {aka class std::set<Item<int>*, std::less<Item<int>*>, std::allocator<Item<int>*> >&}’ (source type is not polymorphic)

但是如果我没记错,ItemBase是多态的:

class ItemBase {
public:
    virtual ~ItemBase() = 0;

};
inline ItemBase::~ItemBase() {}

0 个答案:

没有答案