对于一个小的库项目,我使用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