#include <tuple>
#include <iostream>
#include <string>
// tuple printer
template<class Tuple, std::size_t N>
struct TuplePrinter {
static std::ostream& print(std::ostream& os, const Tuple& t)
{
TuplePrinter<Tuple, N - 1>::print(os, t);
os << ", " << std::get<N - 1>(t);
return os;
}
};
template<class Tuple>
struct TuplePrinter<Tuple, 1> {
static std::ostream& print(std::ostream& os, const Tuple& t)
{
os << std::get<0>(t);
return os;
}
};
template<class... Args>
std::ostream& print(std::ostream& os, const std::tuple<Args...>& t)
{
os << "(";
TuplePrinter<decltype(t), sizeof...(Args)>::print(os, t);
os << ")\n";
return os;
}
// class to keep tuple inside
template<typename... Args>
class tuple_class {
template<typename... Args2>
friend std::ostream& operator<<(std::ostream& os, const tuple_class<Args2...> &m);
std::tuple<Args...> tup;
public:
tuple_class(Args&&... args) : tup(std::forward<Args>(args)...) {
}
};
// usage of the printer
template<typename... Args>
std::ostream& operator<<(std::ostream& os, const tuple_class<Args...> &m) {
print(os, m.tup);
return os;
}
int main() {
tuple_class<int,float,std::string> tc( 1,3.0f,"string" );
std::cout << tc;
return 0;
}
I2luY2x1ZGUgPHR1cGxlPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxzdHJpbmc+CgovLyB0dXBsZSBwcmludGVyCnRlbXBsYXRlPGNsYXNzIFR1cGxlLCBzdGQ6OnNpemVfdCBOPgpzdHJ1Y3QgVHVwbGVQcmludGVyIHsKICAgIHN0YXRpYyBzdGQ6Om9zdHJlYW0mIHByaW50KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFR1cGxlJiB0KQogICAgewogICAgICAgIFR1cGxlUHJpbnRlcjxUdXBsZSwgTiAtIDE+OjpwcmludChvcywgdCk7CiAgICAgICAgb3MgPDwgIiwgIiA8PCBzdGQ6OmdldDxOIC0gMT4odCk7CiAgICAgICAgcmV0dXJuIG9zOwogICAgfQp9OwoKdGVtcGxhdGU8Y2xhc3MgVHVwbGU+CnN0cnVjdCBUdXBsZVByaW50ZXI8VHVwbGUsIDE+IHsKICAgIHN0YXRpYyBzdGQ6Om9zdHJlYW0mIHByaW50KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFR1cGxlJiB0KQogICAgewogICAgICAgIG9zIDw8IHN0ZDo6Z2V0PDA+KHQpOwogICAgICAgIHJldHVybiBvczsKICAgIH0KfTsKCnRlbXBsYXRlPGNsYXNzLi4uIEFyZ3M+CnN0ZDo6b3N0cmVhbSYgcHJpbnQoc3RkOjpvc3RyZWFtJiBvcywgY29uc3Qgc3RkOjp0dXBsZTxBcmdzLi4uPiYgdCkKewogICAgb3MgPDwgIigiOwogICAgVHVwbGVQcmludGVyPGRlY2x0eXBlKHQpLCBzaXplb2YuLi4oQXJncyk+OjpwcmludChvcywgdCk7CiAgICBvcyA8PCAiKVxuIjsKICAgIHJldHVybiBvczsKfQoKCi8vIGNsYXNzIHRvIGtlZXAgdHVwbGUgaW5zaWRlCnRlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3M+CmNsYXNzIHR1cGxlX2NsYXNzIHsKICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3MyPgogICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCB0dXBsZV9jbGFzczxBcmdzMi4uLj4gJm0pOwoKICAgIHN0ZDo6dHVwbGU8QXJncy4uLj4gdHVwOwpwdWJsaWM6CiAgICB0dXBsZV9jbGFzcyhBcmdzJiYuLi4gYXJncykgOiB0dXAoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKSB7CgogICAgfQp9OwoKLy8gdXNhZ2Ugb2YgdGhlIHByaW50ZXIKdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJncz4Kc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IHR1cGxlX2NsYXNzPEFyZ3MuLi4+ICZtKSB7CiAgICBwcmludChvcywgbS50dXApOwogICAgcmV0dXJuIG9zOwp9CgoKCmludCBtYWluKCkgewogICAgdHVwbGVfY2xhc3M8aW50LGZsb2F0LHN0ZDo6c3RyaW5nPiB0YyggMSwzLjBmLCJzdHJpbmciICk7CiAgICBzdGQ6OmNvdXQgPDwgdGM7CiAgICByZXR1cm4gMDsKfQ==