根据该输入字符串将字符串映射到不同的类

时间:2017-01-12 14:52:18

标签: c++

我正在尝试使用以下模板创建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?

1 个答案:

答案 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_ptrstd::function可能会在您的应用中引入明显的开销。