2017-01-12 23 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'相比,它沒有任何開銷,但與諸如「不同類型的多個向量」*(由於局部性)*相比,它具有顯着的開銷,這是用戶可能想要的/需要。 –