#include <utility>
#include <tuple>
template < typename T>
struct unqualified {
typedef typename std:: remove_cv < typename std:: remove_reference < T> :: type > :: type type;
} ;
template < int ...>
struct indices_list { typedef indices_list type; } ;
template < int N, int ... I >
struct indices : indices< N- 1 , N- 1 , I...> { } ;
template < int ... I >
struct indices< 0 , I...> : indices_list< I...> { } ;
template < typename T>
struct tuple_indices : indices< std:: tuple_size < typename unqualified< T> :: type > :: value > { } ;
template < int ...I , int ...J , typename Tuple0, typename Tuple1>
auto awesome_tuple_dog( indices_list< I...> , indices_list< J...> , Tuple0&& t0, Tuple1&& t1 ) {
return std:: make_tuple ( std:: get < I> ( std:: forward < Tuple0> ( t0) ) ..., std:: get < J> ( std:: forward < Tuple1> ( t1) ) ... ) ;
}
template < typename Tuple0, typename Tuple1>
auto awesome_tuple_cat( Tuple0&& t0, Tuple1&& t1 ) {
return awesome_tuple_dog( tuple_indices< Tuple0> ( ) , tuple_indices< Tuple1> ( ) , std:: forward < Tuple0> ( t0 ) , std:: forward < Tuple1> ( t1 ) ) ;
}
int main ( ) {
std:: tuple < bool , char > a;
std:: tuple < short , int > b;
struct { } _ = awesome_tuple_cat( a, b ) ;
}
I2luY2x1ZGUgPHV0aWxpdHk+CiNpbmNsdWRlIDx0dXBsZT4KCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnN0cnVjdCB1bnF1YWxpZmllZCB7Cgl0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2N2PCB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8VD46OnR5cGU+Ojp0eXBlIHR5cGU7Cn07Cgp0ZW1wbGF0ZSA8aW50Li4uPiAKc3RydWN0IGluZGljZXNfbGlzdCB7IHR5cGVkZWYgaW5kaWNlc19saXN0IHR5cGU7IH07Cgp0ZW1wbGF0ZSA8aW50IE4sIGludC4uLiBJPgpzdHJ1Y3QgaW5kaWNlcyA6IGluZGljZXM8Ti0xLCBOLTEsIEkuLi4+IHsgfTsKCnRlbXBsYXRlIDxpbnQuLi4gST4Kc3RydWN0IGluZGljZXM8MCwgSS4uLj4gOiBpbmRpY2VzX2xpc3Q8SS4uLj57IH07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RydWN0IHR1cGxlX2luZGljZXMgOiBpbmRpY2VzPHN0ZDo6dHVwbGVfc2l6ZTx0eXBlbmFtZSB1bnF1YWxpZmllZDxUPjo6dHlwZT46OnZhbHVlPiB7IH07Cgp0ZW1wbGF0ZSA8aW50IC4uLkksIGludCAuLi5KLCB0eXBlbmFtZSBUdXBsZTAsIHR5cGVuYW1lIFR1cGxlMT4KYXV0byBhd2Vzb21lX3R1cGxlX2RvZyggaW5kaWNlc19saXN0PEkuLi4+LCBpbmRpY2VzX2xpc3Q8Si4uLj4sIFR1cGxlMCYmIHQwLCBUdXBsZTEmJiB0MSApIHsKICAgIHJldHVybiBzdGQ6Om1ha2VfdHVwbGUoIHN0ZDo6Z2V0PEk+KCBzdGQ6OmZvcndhcmQ8VHVwbGUwPih0MCkgKS4uLiwgc3RkOjpnZXQ8Sj4oIHN0ZDo6Zm9yd2FyZDxUdXBsZTE+KHQxKSApLi4uICk7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZTAsIHR5cGVuYW1lIFR1cGxlMT4KYXV0byBhd2Vzb21lX3R1cGxlX2NhdCggVHVwbGUwJiYgdDAsIFR1cGxlMSYmIHQxICkgewogICAgcmV0dXJuIGF3ZXNvbWVfdHVwbGVfZG9nKCB0dXBsZV9pbmRpY2VzPFR1cGxlMD4oKSwgdHVwbGVfaW5kaWNlczxUdXBsZTE+KCksIHN0ZDo6Zm9yd2FyZDxUdXBsZTA+KCB0MCApLCBzdGQ6OmZvcndhcmQ8VHVwbGUxPiggdDEgKSApOwp9CgppbnQgbWFpbiAoKSB7CiAgICBzdGQ6OnR1cGxlPGJvb2wsIGNoYXI+IGE7CiAgICBzdGQ6OnR1cGxlPHNob3J0LCBpbnQ+IGI7CiAgICBzdHJ1Y3Qge30gXyA9IGF3ZXNvbWVfdHVwbGVfY2F0KCBhLCBiICk7CiAgICAKfQ==
compilation info
prog.cpp:22:90: warning: ‘awesome_tuple_dog’ function uses ‘auto’ type specifier without trailing return type [enabled by default]
auto awesome_tuple_dog( indices_list<I...>, indices_list<J...>, Tuple0&& t0, Tuple1&& t1 ) {
^
prog.cpp:27:50: warning: ‘awesome_tuple_cat’ function uses ‘auto’ type specifier without trailing return type [enabled by default]
auto awesome_tuple_cat( Tuple0&& t0, Tuple1&& t1 ) {
^
prog.cpp: In function ‘int main()’:
prog.cpp:34:43: error: conversion from ‘std::tuple<bool, char, short int, int>’ to non-scalar type ‘main()::<anonymous struct>’ requested
struct {} _ = awesome_tuple_cat( a, b );
^
stdout