#include <iostream>
#include <tuple>
using namespace std;
template<typename T, typename R = conditional_t<is_same<T, char const*>::value, string, T>>
R bar (T &&value) {return value;}
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>
decltype(auto) operator<<(std::basic_ostream<Ch, Tr>& os,
const std::tuple<Args...>& t)
{
os << "(";
print_tuple_impl(os, t, std::index_sequence_for<Args...>{});
return os << ")";
}
template<typename...Args>
decltype(auto) foo(Args...args)
{
return [args = make_tuple(bar(args)...)] () { cout<< args; return; };
}
int main() {
// your code goes here
string *s = new string("Hello, World!");
const char *p = s->c_str();
auto f = foo(1, p, 3.14);
delete s;
f();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHVwbGU+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBSID0gY29uZGl0aW9uYWxfdDxpc19zYW1lPFQsIGNoYXIgY29uc3QqPjo6dmFsdWUsIHN0cmluZywgVD4+ClIgYmFyIChUICYmdmFsdWUpIHtyZXR1cm4gdmFsdWU7fQoKdGVtcGxhdGU8Y2xhc3MgQ2gsIGNsYXNzIFRyLCBjbGFzcyBUdXBsZSwgc3RkOjpzaXplX3QuLi4gSXM+CnZvaWQgcHJpbnRfdHVwbGVfaW1wbChzdGQ6OmJhc2ljX29zdHJlYW08Q2gsVHI+JiBvcywKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR1cGxlICYgdCwKICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aW5kZXhfc2VxdWVuY2U8SXMuLi4+KQp7CiAgICB1c2luZyBzd2FsbG93ID0gaW50W107IC8vIGd1YXJhbnRpZXMgbGVmdCB0byByaWdodCBvcmRlcgogICAgKHZvaWQpc3dhbGxvd3swLCAodm9pZChvcyA8PCAoSXMgPT0gMD8gIiIgOiAiLCAiKSA8PCBzdGQ6OmdldDxJcz4odCkpLCAwKS4uLn07Cn0KIAp0ZW1wbGF0ZTxjbGFzcyBDaCwgY2xhc3MgVHIsIGNsYXNzLi4uIEFyZ3M+CmRlY2x0eXBlKGF1dG8pIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPENoLCBUcj4mIG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dHVwbGU8QXJncy4uLj4mIHQpCnsKICAgIG9zIDw8ICIoIjsKICAgIHByaW50X3R1cGxlX2ltcGwob3MsIHQsIHN0ZDo6aW5kZXhfc2VxdWVuY2VfZm9yPEFyZ3MuLi4+e30pOwogICAgcmV0dXJuIG9zIDw8ICIpIjsKfQoKdGVtcGxhdGU8dHlwZW5hbWUuLi5BcmdzPgpkZWNsdHlwZShhdXRvKSBmb28oQXJncy4uLmFyZ3MpCnsKICAgIHJldHVybiBbYXJncyA9IG1ha2VfdHVwbGUoYmFyKGFyZ3MpLi4uKV0gKCkgeyBjb3V0PDwgYXJnczsgcmV0dXJuOyB9Owp9CgppbnQgbWFpbigpIHsKCS8vIHlvdXIgY29kZSBnb2VzIGhlcmUKCXN0cmluZyAqcyA9IG5ldyBzdHJpbmcoIkhlbGxvLCBXb3JsZCEiKTsKCWNvbnN0IGNoYXIgKnAgPSBzLT5jX3N0cigpOwoJYXV0byBmID0gZm9vKDEsIHAsIDMuMTQpOwoJZGVsZXRlIHM7CglmKCk7CglyZXR1cm4gMDsKfQ==