我正在尝试使用以下模板创建C ++地图
map<string,class> mapper;
其中mapper将包含以下数据
mapper['a'] = Class A or object of Class A
mapper['b'] = Class B or object of Class B
mapper['c'] = Class C or object of Class C
这种地图的映射器模板应该是什么,根据输入字符串选择Class?
答案 0 :(得分:1)
假设字符串仅在运行时已知并且您可以构建类的层次结构,最简单的选项是使用多态和std::function
来构建工厂函数的映射:
...鉴于
struct Base
{
virtual ~Base() { }
};
struct Derived0 : Base { };
struct Derived1 : Base { };
// ...
......你可以......
std::map<std::string, std::function<std::unique_ptr<Base>>> map;
map["derived0"] = []{ return std::make_unique<Derived0>(); };
map["derived1"] = []{ return std::make_unique<Derived1>(); };
// ...
......可以按如下方式使用:
std::string desiredType;
std::cin >> desiredType;
auto result = map[desiredType]();
请注意,这种设计通常是代码气味。仔细考虑你想要达到的目标 - 可能有更清洁/更优雅的方式。
此外,使用std::unique_ptr
和std::function
可能会在您的应用中引入明显的开销。