- #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==