2008-10-30 33 views
28

我想要一個具有齊次鍵類型但異構數據類型的映射。你如何製作異構boost :: map?

我希望能夠像做(僞代碼):

boost::map<std::string, magic_goes_here> m; 
m.add<int>("a", 2); 
m.add<std::string>("b", "black sheep"); 

int i = m.get<int>("a"); 
int j = m.get<int>("b"); // error! 

我能有一個指向基類的數據類型,但寧可不要。

我從來沒有使用過提升,但看過融合庫,但無法弄清楚我需要做什麼。

感謝您的幫助。

+2

`boost :: variant` – 2014-02-10 22:41:55

+0

如果你知道所有可能的類型,你可能想要在地圖中填充,然後`boost :: variant`將很好。如果你真的想要任何類型,那麼`boost :: any`就是要走的路。 – Kurt 2014-03-07 05:21:58

回答

34
#include <map> 
#include <string> 
#include <iostream> 
#include <boost/any.hpp> 

int main() 
{ 
    try 
    { 
     std::map<std::string, boost::any> m; 
     m["a"] = 2; 
     m["b"] = static_cast<char const *>("black sheep"); 

     int i = boost::any_cast<int>(m["a"]); 
     std::cout << "I(" << i << ")\n"; 

     int j = boost::any_cast<int>(m["b"]); // throws exception 
     std::cout << "J(" << j << ")\n"; 
    } 
    catch(...) 
    { 
     std::cout << "Exception\n"; 
    } 

} 
+1

而不是cumbersome_cast,你可以使用`std :: decay`。 – 2012-03-17 01:17:05

9

How can I build a <favorite container> of objects of different types?

你不能,但你可以僞造它相當不錯。在C/C++中,所有數組都是同類的(即元素都是相同的類型)。但是,通過額外的間接層,您可以給出異構容器的外觀(異構容器是包含的對象具有不同類型的容器)。

有兩種情況的異構容器。

第一種情況發生在您想要存儲在容器中的所有對象都從公共基類中公開派生時。

第二種情況發生在對象類型不相交時 - 它們不共享公共基類。
這裏的方法是使用句柄類。容器是句柄對象的容器(通過值或指針,您的選擇;按價值更容易)。每個句柄對象知道如何「堅持」(即保持一個指向)你想要放入容器的一個對象。您可以使用具有多種不同類型指針的單個句柄類作爲實例數據,也可以使用影響您希望包含的各種類型的句柄類層次結構(要求容器具有句柄基類指針)。這種方法的不足之處在於,每次更改可以包含的類型集時,都會打開句柄類來進行維護。好處是您可以使用句柄類來封裝大部分內存管理和對象生命週期的醜陋。因此,即使在第一種情況下,使用手柄物體也是有益的。

5

謝謝大衛,那正是我所需要的。這是工作解決方案。

#include <iostream> 
using std::cout; 
using std::endl; 

#include <map> 
#include <boost/any.hpp> 

using boost::any_cast; 
typedef std::map<std::string, boost::any> t_map; 


int main(int argc, char **argv) 
{ 

    t_map map; 
    char *pc = "boo yeah!"; 

    map["a"] = 2.1; 
    map["b"] = pc; 

    cout << "map contents" << endl; 
    cout << any_cast<double>(map["a"]) << endl; 
    cout << any_cast<char*>(map["b"]) << endl; 

    return 0; 
} 
0

提升任何肯定的作品,但我認爲使用INT鍵入技術作爲融合圖的關鍵類型是一個更好的解決方案。沒有類型的擦除和可能更快