2017-01-12 21 views
0

我试图创建一个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 

应该是什么的模板这种映射器是基于输入字符串选择Class的映射器吗?

+1

听起来像多态的情况。 – NathanOliver

+0

多态性或如果类不相关,那么也许'std :: any'。 –

+0

看起来像不好的设计,解释你想要达到的效果 – Slava

回答

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可能会在您的应用程序中引入明显的开销。

+0

我想说,初始化可能需要一些开销,但一旦你使用指针,我怀疑'std :: unique_ptr'有很大的开销。 –

+0

@GillBates:与原始'new' /'delete'相比,它没有任何开销,但与诸如“不同类型的多个向量”*(由于局部性)*相比,它具有显着的开销,这是用户可能想要的/需要。 –