2011-08-05 8 views
2

タプルやタプルのリストを1つのタプルにマージするための汎用テンプレートを考え出しています。コンパイル時にエラーが発生します。C++ 0xタプルをマージする

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; 
+3

は何ですか作品エラー?なぜあなたは答えを求めているときにそれを与えないことで、私たちのためにそれをもっと難しくしますか? – Nobody

+1

'std :: tuple_cat'はあなたがやろうとしていることをすでにしていますか? (私は 'merge_tuples'が実際に何をしているのか分かりません)。 –

+0

merge_tuplesはタプルやタプルのリストから新しいタプルを作成します tuple_catは私の望むようには見えませんでした。それを調べますagian – James

答えて

1

おかげで、それは

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; 
};