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

Map string to different classes based on that input string

本文关键字:字符串 输入 映射      更新时间:2023-10-16

我正在尝试使用以下模板创建C++地图

map<string,class> 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

对于这种根据输入字符串选择类的映射,映射器的模板应该是什么?

假设字符串仅在运行时已知,并且您可以构建类的层次结构,最简单的选择是使用多态性和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 可能会在应用程序中引入明显的开销。