将 class 类型存储为映射值并根据映射键初始化新的 class
Store class type as map value and initialize new class based on map key
我想编写一个函数,returns 一个新的 class 实例,该实例基于从 Enum 到 class 类型的静态映射。
Base* getBase(Enum e) {
static const map<Enum, class type???> base_map = {
{ EnumA, Derived1 }, // Derived1,2,3 are subclasses of Base
{ EnumB, Derived2 },
{ EnumC, Derived3 },
};
return new base_map[e];
}
是否可以在 C++ 中执行此操作?如果是这样,地图的价值应该是什么类型?
我想我可以使用长 if-else
来达到相同的效果,但使用地图似乎更干净。
您可以存储一个工厂函数 - 大致如下:
Base* getBase(Enum e) {
typedef std::function<Base*()> maker_t;
static const map<Enum, maker_t> base_map = {
{ EnumA, [] { return new Derived1; } },
{ EnumB, [] { return new Derived2; } },
{ EnumC, [] { return new Derived3; } }
};
return base_map[e]();
}
我想编写一个函数,returns 一个新的 class 实例,该实例基于从 Enum 到 class 类型的静态映射。
Base* getBase(Enum e) {
static const map<Enum, class type???> base_map = {
{ EnumA, Derived1 }, // Derived1,2,3 are subclasses of Base
{ EnumB, Derived2 },
{ EnumC, Derived3 },
};
return new base_map[e];
}
是否可以在 C++ 中执行此操作?如果是这样,地图的价值应该是什么类型?
我想我可以使用长 if-else
来达到相同的效果,但使用地图似乎更干净。
您可以存储一个工厂函数 - 大致如下:
Base* getBase(Enum e) {
typedef std::function<Base*()> maker_t;
static const map<Enum, maker_t> base_map = {
{ EnumA, [] { return new Derived1; } },
{ EnumB, [] { return new Derived2; } },
{ EnumC, [] { return new Derived3; } }
};
return base_map[e]();
}