#include <ostream>
#include <iostream>
#include <string>
#include <tuple>
#include <typeinfo>
#include <cstddef>
using namespace std;
template<class Ch, class Tr, class Tuple, std::size_t... Is>
void print_tuple_impl(std::basic_ostream<Ch, Tr>& os,
const Tuple & t,
std::index_sequence<Is...>)
{
using swallow = int[]; // guaranties left to right order
(void)swallow {
0, (void(os << (Is == 0 ? "" : ", ") << std::get<Is>(t)), 0)...
};
}
template<class Ch, class Tr, class... Args>
auto operator<<(std::basic_ostream<Ch, Tr>& os, const std::tuple<Args...>& t)
-> std::basic_ostream<Ch, Tr>&
{
os << "(";
print_tuple_impl(os, t, std::index_sequence_for<Args...>{});
return os << ")";
}
template< class Tuple, std::size_t... Is>
auto tupleCombiner(int firstVal,const Tuple& t, std::index_sequence<Is...>)
{
tuple<int, char, int, char> combinedTuple{ firstVal, std::get<Is>(t)... };
return combinedTuple;
}
template< class... Args>
auto tupleCombine(int firstVal,const std::tuple<Args...>& t)
{
return tupleCombiner(firstVal,t,std::index_sequence_for<Args...>{});
}
int main()
{
auto combinedTuples= tupleCombine(1,make_tuple('A', 2, 'B'));
std::cout << combinedTuples;
return 0;
}
CiNpbmNsdWRlIDxvc3RyZWFtPgojaW5jbHVkZSA8aW9zdHJlYW0+ICAKI2luY2x1ZGUgPHN0cmluZz4gIAojaW5jbHVkZSA8dHVwbGU+CiNpbmNsdWRlIDx0eXBlaW5mbz4KI2luY2x1ZGUgPGNzdGRkZWY+IAp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGU8Y2xhc3MgQ2gsIGNsYXNzIFRyLCBjbGFzcyBUdXBsZSwgc3RkOjpzaXplX3QuLi4gSXM+CnZvaWQgcHJpbnRfdHVwbGVfaW1wbChzdGQ6OmJhc2ljX29zdHJlYW08Q2gsIFRyPiYgb3MsCgljb25zdCBUdXBsZSAmIHQsCglzdGQ6OmluZGV4X3NlcXVlbmNlPElzLi4uPikKewoJdXNpbmcgc3dhbGxvdyA9IGludFtdOyAvLyBndWFyYW50aWVzIGxlZnQgdG8gcmlnaHQgb3JkZXIKCSh2b2lkKXN3YWxsb3cgewoJCTAsICh2b2lkKG9zIDw8IChJcyA9PSAwID8gIiIgOiAiLCAiKSA8PCBzdGQ6OmdldDxJcz4odCkpLCAwKS4uLgoJfTsKfQoKdGVtcGxhdGU8Y2xhc3MgQ2gsIGNsYXNzIFRyLCBjbGFzcy4uLiBBcmdzPgphdXRvIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPENoLCBUcj4mIG9zLCBjb25zdCBzdGQ6OnR1cGxlPEFyZ3MuLi4+JiB0KQotPiBzdGQ6OmJhc2ljX29zdHJlYW08Q2gsIFRyPiYKewoJb3MgPDwgIigiOwoJcHJpbnRfdHVwbGVfaW1wbChvcywgdCwgc3RkOjppbmRleF9zZXF1ZW5jZV9mb3I8QXJncy4uLj57fSk7CglyZXR1cm4gb3MgPDwgIikiOwp9CgoKCnRlbXBsYXRlPCAgY2xhc3MgVHVwbGUsIHN0ZDo6c2l6ZV90Li4uIElzPgphdXRvIHR1cGxlQ29tYmluZXIoaW50IGZpcnN0VmFsLGNvbnN0IFR1cGxlJiB0LCBzdGQ6OmluZGV4X3NlcXVlbmNlPElzLi4uPikKewoJdHVwbGU8aW50LCBjaGFyLCBpbnQsIGNoYXI+IGNvbWJpbmVkVHVwbGV7IGZpcnN0VmFsLCBzdGQ6OmdldDxJcz4odCkuLi4gICB9OwoJcmV0dXJuIGNvbWJpbmVkVHVwbGU7Cn0KCnRlbXBsYXRlPCBjbGFzcy4uLiBBcmdzPgphdXRvIHR1cGxlQ29tYmluZShpbnQgZmlyc3RWYWwsY29uc3Qgc3RkOjp0dXBsZTxBcmdzLi4uPiYgdCkKewpyZXR1cm4JdHVwbGVDb21iaW5lcihmaXJzdFZhbCx0LHN0ZDo6aW5kZXhfc2VxdWVuY2VfZm9yPEFyZ3MuLi4+e30pOwp9CgppbnQgbWFpbigpCnsJIAoJYXV0byBjb21iaW5lZFR1cGxlcz0gdHVwbGVDb21iaW5lKDEsbWFrZV90dXBsZSgnQScsIDIsICdCJykpOwogCglzdGQ6OmNvdXQgPDwgY29tYmluZWRUdXBsZXM7CgoJcmV0dXJuIDA7Cn0K