2010-10-20 64 views
7

我正在尋找一個混合元容器/容器類。我想要一個將編譯時類型映射到運行時值的類。代碼snippit價值1024字如此:將類型映射爲值的std :: map像容器

struct Foo { /* ... */ }; 
struct Bar { /* ... */ }; 

int main() 
{ 
    meta_container<Foo,float,int> mc; 
    mc.get<float>() = 1.0f; 
    mc.get<Foo>().method(blah); 
    mc.get<Bar>(); //compiler error 
} 

這真是無聊的東西。使用可變參數模板的實現將會非常有趣,但界面非常簡單。

使這個更困難的部分是我想要的最後一個功能。

void foo(const meta_constainer<Foo,Bar,Baz>& mc); 

//make_mc is sorta like make_pair or make_tuple. 

int main() 
{ 
    foo(make_mc(Foo(), Bar(), Baz())); // not really interesting 
    foo(make_mc(Bar(), Foo(), Baz())); // this is more challenging 
    foo(make_mc(Foo())); // this might be difficult as well. 
} 

我可以寫這樣一個容器,但我想找到一個已經寫/調試的容器。我最大的絆腳石是缺乏好搜索關鍵字(異構容器不是我想要的)。

是否存在具有此類或類似接口的Boost庫?

這個東西叫什麼,所以我可以更有效地谷歌它?


更新:

我不是在尋找:

  • boost::mpl::map
    這映射編譯時間值編譯時間值
  • std::map<*,boost::any>
    這映射一個靜態類型運行時間值轉換爲動態類型運行時間值
  • std::map<*,boost::variadic<*>>
    這是一個靜態類型化的運行值映射到變量類型運行值
  • std::map<typeid,boost::variadic<*>>
    這是接近我想,但它使用RTTI什麼,它是不是如果用錯誤類型訪問的編譯錯誤。

回答

3
+0

'提振::融合:: set'確實比我更想和少,但它是迄今爲止我見過的最好的。它需要排序參數,所以我的無序列表示例不起作用。 – 2010-10-20 16:37:41

+0

嗯,我會認爲fusion :: vector是你在找什麼?你可以結合一個枚舉來實現你所需要的東西? – Nim 2010-10-20 16:44:41

+0

'fusion :: set'允許我將'int'映射到一個整數值,並將'float'映射到一個浮點值。 'fusion :: vector'將編譯時間'0'映射爲整數值,編譯時間'1'映射爲浮點值。我可以在'0','1'常量和'int','float'之間做一個輔助映射,但是'fusion :: set'對我來說已經是這樣了。 – 2010-10-20 17:14:44

相關問題