代码之家  ›  专栏  ›  技术社区  ›  sellibitze

将boost::tuples::cons<…>转换回相应的boost::tuple<…>

  •  3
  • sellibitze  · 技术社区  · 14 年前

    对于一个小的库项目,我使用boost::tuple。现在,我面临的问题是将通过元编程操作的“cons list”返回到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支持来尝试,只是发现它还没有工作:

    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
    

    2 回复  |  直到 14 年前
        1
  •  3
  •   Luc Touraille    14 年前

    如果您正在进行模板元编程,并且需要从类型列表转换为元组,则可能应该考虑使用 Boost.MPL Boost.Fusion . 前者提供一组编译时容器和算法来操作时间列表,后者通过提供“混合”容器和算法来连接纯编译时(MPL)和纯运行时(STL),这些容器和算法可以在编译时通过模板元编程进行操作,也可以在运行时作为元组进行操作。

    然而,为了回答您的问题,我认为您不需要将cons列表转换为tuple,因为tuple类只是更容易声明tuple的一种便利。实际上,tuple只是从其对应的cons列表继承,例如。 tuple<int, float> cons<int, cons<float, null_type> > 不添加任何成员数据或函数。所以基本上,当你宣布 tuple

        2
  •  0
  •   Benoît photo_tom    14 年前

    显然,你问题的答案与 Boost.Preprocessor .

    看看BooStYppppLoalAlgRead,BooStPypp.EngopyPARAMS和BooStPyppnnPARAMS。他们是关键。