2010-10-25 74 views
3

對於我使用boost ::元組有點庫項目。現在,我面臨着通過元編程將我操作的「缺點列表」轉回到boost :: tuple < ...>類型的問題。 「髒」的解決方案將提供大量的局部specialications一拉談到的boost ::元組::利弊<...>回相應的boost ::元組<...>

template<class T> struct id{typedef T type;}; 

template<class TL> struct type_list_to_tuple_type; 

template<class T1> 
struct type_list_to_tuple_type< 
    boost::tuples::cons<T1,boost::tuples::null_type> 
> : id<boost::tuple<T1> > {} 

template<class T1, class T2> 
struct type_list_to_tuple_type< 
    boost::tuples::cons<T1, 
    boost::tuples::cons<T2,boost::tuples::null_type> > 
> : id<boost::tuple<T1,T2> > {} 

template<class T1, class T2, class T3> 
struct type_list_to_tuple_type< 
    boost::tuples::cons<T1, 
    boost::tuples::cons<T2, 
    boost::tuples::cons<T3,boost::tuples::null_type> > > 
> : id<boost::tuple<T1,T2,T3> > {} 

... 

,但這是繁瑣且容易出錯,尤其是因爲我需要與可能的許多元素的元組的支持。這些元組類型是通過操作符重載自動生成的。如果可能的話,我想避免編寫這麼多的專業化。

如何做到這一點沒有任何 C++ 0x特性的任何想法?我想這是不可能的。但也許我忽略了一些東西。

編輯:其實,我與實驗的C++ 0x的支持才發現,它並沒有正常工作試過這樣:

template<class TPH> 
class type_pack_holder_to_tuple_type; 

template<class...Types> 
class type_pack_holder_to_tuple_type< 
     type_pack_holder<Types...> > 
: id< boost::tuple<Types...> > {}; 

G ++ 4.5.1說:

sorry, unimplemented: cannot expand 'Types ...' into 
a fixed-length argument list 

:-(

回答

3

如果您正在進行模板元編程,並且需要將類型列表轉換爲元組,則可能應考慮使用Boost.MPLBoost.Fusion。前者提供了一組編譯時間容器和算法來操作時間表,後者通過提供「混合」容器和算法來完成純編譯時(MPL)和純運行時(STL)之間的鏈接,可以是在編譯時通過模板元編程進行操作,或者在運行時作爲元組進行操作。

然而,要回答你的問題,我不認爲你需要改變你的缺點列出爲一個元組,因爲元組類僅僅是一個方便更容易聲明元組。實際上,元組簡單地從其相應的缺點列表繼承,例如tuple<int, float>繼承自cons<int, cons<float, null_type> >而不添加任何成員數據或功能。所以基本上,當你聲明一個tuple時,庫「創建」了相應的缺點清單;由於您已經創建了自己的缺點清單,因此您不再需要元組類。

+0

我只是要去直接使用利弊,謝謝! – sellibitze 2010-10-25 13:38:58

0

顯然,回答你的問題是與Boost.Preprocessor。 枚舉的模板參數是一種其特殊性的!

看一看BOOST_PP_LOCAL_ITERATE,BOOST_PP_ENUM_PARAMS和BOOST_PP_N_PARAMS。他們是關鍵。

BOOST_PP_REPEAT和BOOST_PP_COMMA_IF可能有一定的幫助,以及。

相關問題