c++ - 在模板中使用派生类并将其存储到基类的 vector 中

标签 c++ oop templates inheritance dictionary

我正在尝试使用 std::map 和存储类型的 Type 类在 C++ 中创建类型映射。然后有一个基类 Base 和一些我要存储的派生类。

template <typename T>
class Type {

public:
    Type() {}

    virtual ~Type() {}
    virtual T* allocate() const { return new T; }
    virtual T* cast(void *object) const { return static_cast<T*>(object); }
};

这很好用:

map<int, Base*> typeMap;
typeMap[1] = new Derive();

但是当尝试做这样的事情时,我得到了错误:类型“Type *”的值不能分配给类型“Type *”的实体

map<int, Type<Base>*> typeMap;
typeMap[1] = new Type<Derive>();

有机会存储这样的东西吗?我不想要任何库解决方案(非开源)

最佳答案

类似于@pmr 的回答,但使用 std::tuple

#include <tuple>
#include <type_traits>

class Base{};
class Derived : public Base {};

template<std::size_t i>
struct my_map
{
private:
    using myTuple = std::tuple<Base, Derived>;
public:
    using type = typename std::tuple_element<i, myTuple>::type;
};

static_assert(std::is_same<Base, my_map<0>::type>::value, "bad type");
static_assert(std::is_same<Derived, my_map<1>::type>::value, "bad type");

关于c++ - 在模板中使用派生类并将其存储到基类的 vector 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24799614/

相关文章:

c++ - 使用 #define 指令作为代码的 "part",而不是在文件顶部

c++ - boost 单元测试 mpl 列表的笛卡尔积

c++ - 函数重载和模板推导优先级

javascript - vue.js 的 <template> 语法不起作用

c++ - 从字节和切片中获取位 2 位对

c++ - std::vector::end() 迭代器如何在内存中工作?

c++ - 将命令参数与 argv[] 进行比较不起作用

java - 为什么我的 JSoup getTitle() 方法返回 null 而不是网页标题?

models - 为什么 CASE 工具没有成功?

java - 在 Activity 之间传递扩展抽象类的对象