Для небольшого библиотечного проекта я использую 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
: - (