2010-10-25 48 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可能有一定的帮助,以及。

相关问题