对于一个小型库项目,我使用的是boost::tuple。现在,我面临的问题是将我通过元编程操作的“反列表”转换回boost::tuple<...>类型。“肮脏”的解决方案是提供大量的局部专业知识。
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:-(
发布于 2010-10-25 12:57:32
如果您正在进行模板元编程,并且需要从打字员转换为元组,也许您应该考虑使用Boost.MPL和Boost.Fusion。前者提供了一组编译时容器和算法来操作时间列表,后者通过提供“混合”容器和算法来建立纯编译时(MPL)和纯运行时(STL)之间的链接,这些容器和算法既可以通过模板元编程在编译时操作,也可以作为元组在运行时进行操作。
但是,为了回答您的问题,我不认为您需要将您的cons列表转换为tuple,因为tuple类只是更容易地声明tuple的一种方便。实际上,tuple只是从其相应的cons列表继承,例如tuple<int, float>从cons<int, cons<float, null_type> >继承,而不添加任何成员数据或函数。因此,基本上,当您声明一个tuple时,库将“创建”相应的cons列表;因为您已经创建了您自己的cons列表,所以您不再需要元组类了。
发布于 2010-10-25 12:44:23
显然,您的问题的答案与Boost.Preprocessor有关。模板参数的枚举是它的一种特长!
看看BOOST_PP_LOCAL_ITERATE,BOOST_PP_ENUM_PARAMS和BOOST_PP_N_PARAMS。他们是关键。
BOOST_PP_REPEAT和BOOST_PP_COMMA_IF也可能有所帮助。
https://stackoverflow.com/questions/4014529
复制相似问题