2013-02-28 25 views
4

我想有一個std::hash_map映射(例如)常規std:string s到多個不同的專業化另一個模板類。C++ hash_map與非專門模板作爲值

這個例子是我想要實現(這是錯誤的,並不能編譯,雖然):

template<typename T> 
class Foo { 
public: 
    Foo(T _value) 
    { 
    this-> value = _value; 
    } 

private: 
    T value; 
}; 

int main() 
{ 
    hash_map<string, Foo> various_foos; 
    various_foos["foo"] = Foo<int>(17); 
    various_foos["bar"] = Foo<double>(17.4); 
} 
+0

你必須讓他們從某種FooBase'基類,然後存儲(可能智能)指針或引用'繼承。然後有一些可用來確定它真正包含的id。 – BoBTFish 2013-02-28 17:02:20

+2

除非你有s.th,否則這將不起作用。就像['boost :: any'](http://www.boost.org/doc/libs/1_53_0/doc/html/any.html)你可以存儲在'std :: map'中一樣。 – 2013-02-28 17:02:44

回答

2

你一般不能在你的散列這是一個不完整的類型的元素。你可以創建一個其他人可以繼承的非模板基類嗎?

其原因主要歸結爲編譯器將如何解釋您的請求。如果無法計算Foo結構的大小,則無法創建hash_map的內部結構。

9

地圖只能存儲單個值類型,因此它不能直接存儲不同類型的對象;而一個類模板的不同特化是不同的類型。

常見的解決方案是:

  • 存儲指針到多態性鹼基類型,並且經由虛擬函數或RTTI訪問真正的類型。您將需要小心管理對象本身 - 要麼存儲智能指針,要麼將它們保存在其他數據結構中。
  • 商店可識別聯合型,如boost::variantboost::any