首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将boost::tuples::cons<...>转换回相应的boost::tuple<...>

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

Stack Overflow用户
提问于 2010-10-25 12:31:30
回答 2查看 1K关注 0票数 3

对于一个小型库项目,我使用的是boost::tuple。现在,我面临的问题是将我通过元编程操作的“反列表”转换回boost::tuple<...>类型。“肮脏”的解决方案是提供大量的局部专业知识。

代码语言:javascript
复制
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支持下尝试了这一点,结果发现它还没有工作:

代码语言:javascript
复制
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说:

代码语言:javascript
复制
sorry, unimplemented: cannot expand 'Types ...' into
a fixed-length argument list

:-(

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-25 12:57:32

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

但是,为了回答您的问题,我不认为您需要将您的cons列表转换为tuple,因为tuple类只是更容易地声明tuple的一种方便。实际上,tuple只是从其相应的cons列表继承,例如tuple<int, float>cons<int, cons<float, null_type> >继承,而不添加任何成员数据或函数。因此,基本上,当您声明一个tuple时,库将“创建”相应的cons列表;因为您已经创建了您自己的cons列表,所以您不再需要元组类了。

票数 3
EN

Stack Overflow用户

发布于 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也可能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4014529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档