c ++ 0x объединяющие кортежи - PullRequest
       3

c ++ 0x объединяющие кортежи

2 голосов
/ 05 августа 2011

Я пытаюсь найти общий шаблон для объединения списка кортежей или типов в один кортеж. Я получаю сообщение об ошибке при компиляции.

template<typename... Types>
struct merge_tuples{ typedef std::tuple<> type;};

template<typename Type>
struct merge_tuples<Type> {
  typedef std::tuple<Type> type;
};

template<typename...Types>
struct merge_tuples<std::tuple<Types...>> {
  typedef std::tuple<Types...> type;
};

template<typename...Types1,typename...Types2>
struct merge_tuples<std::tuple<Types1...>,std::tuple<Types2...>> {
  typedef std::tuple<Types1...,Types2...> type;
};

template<typename...Types1,typename...Types2,typename...Rest>
struct merge_tuples<std::tuple<Types1...>,std::tuple<Types2...>,Rest...> {
  typedef decltype(merge_tuples<std::tuple<Types1...,Types2...>,decltype(merge_tuples<Rest...>::type)>::type) type;
};

template<typename...Types1,typename Type>
struct merge_tuples<std::tuple<Types1...>,Type> {
  typedef std::tuple<Types1...,Type> type;
};
typedef std::tuple<int,double> int_double;
typedef merge_tuples<int_double,int_double,int_double>::type megred;

Я получаю следующую ошибку

lalr_grammar.cpp:152:97: error: unexpected type name 'type': expected expression
  typedef decltype(merge_tuples<std::tuple<Types1...,Types2...>,decltype(merge_tuples<Rest...>::type)>::type) type;
                                                                                                ^
lalr_grammar.cpp:420:11: note: in instantiation of template class 'merge_tuples<std::__1::tuple<int, double>, std::__1::tuple<int, double>, std::__1::tuple<int, double> >' requested here
  typedef merge_tuples<int_double,int_double,int_double>::type megred;

1 Ответ

1 голос
/ 06 августа 2011

Спасибо за совет Говард Хиннант Я воспользовался вашим советом и сделал некоторые дополнительные изменения, и это работает

template<typename... Types>
struct merge_tuples{
  typedef std::tuple<Types...> type;
};

template<>
struct merge_tuples<> {
  typedef std::tuple< > type;
};

template<typename Type>
struct merge_tuples<Type> {
  typedef std::tuple<Type> type;
};

template<typename...Types>
struct merge_tuples<std::tuple<Types...>> {
  typedef std::tuple<Types...> type;
};

template<typename...Types1,typename...Types2>
struct merge_tuples<std::tuple<Types1...>,std::tuple<Types2...>> {
  typedef std::tuple<Types1...,Types2...> type;
};

template<typename Type1,typename Type2>
struct merge_tuples<Type1,Type2> {
  typedef std::tuple<Type1,Type2> type;
};

template<typename Type,typename... Types>
struct merge_tuples<Type,std::tuple<Types...>> {
  typedef std::tuple<Type,Types...> type;
};

template<typename... Types,typename Type>
struct merge_tuples<std::tuple<Types...>,Type> {
  typedef std::tuple<Types...,Type> type;
};

template<typename...Types,typename Type,typename... Rest>
struct merge_tuples<std::tuple<Types...>,Type,Rest...> {
  typedef typename merge_tuples<Rest...>::type temp;
  typedef typename merge_tuples<std::tuple<Types...,Type>,temp>::type type;
};

template<typename Type,typename... Types,typename... Rest>
struct merge_tuples<Type,std::tuple<Types...>,Rest...> {
  typedef typename merge_tuples<Rest...>::type temp;
  typedef typename merge_tuples<std::tuple<Type,Types...>,temp>::type type;
};

template<typename...Types1,typename... Types2,typename... Rest>
struct merge_tuples<std::tuple<Types1...>,std::tuple<Types2...>,Rest...> {
  typedef typename merge_tuples<Rest...>::type temp;
  typedef typename merge_tuples<std::tuple<Types1...,Types2...>,temp>::type type;
};

template<typename Type1,typename Type2,typename... Rest>
struct merge_tuples<Type1,Type2,Rest...> {
  typedef typename merge_tuples<Rest...>::type temp;
  typedef typename merge_tuples<std::tuple<Type1,Type2>,temp>::type type;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...