#include <iostream>
#include <sstream>
using namespace std;
#define VERSATILE_LITERAL(suffix, implementation) \
auto operator "" suffix(unsigned long long x ) { return implementation(#suffix, x); } \
auto operator "" suffix(long double x ) { return implementation(#suffix, x); } \
auto operator "" suffix(char x ) { return implementation(#suffix, x); } \
auto operator "" suffix(wchar_t x ) { return implementation(#suffix, x); } \
auto operator "" suffix(const char* x, size_t len) { return implementation(#suffix, x); } \
auto operator "" suffix(const wchar_t* x, size_t len) { return implementation(#suffix, x); } \
//endmacro
template<class T> string id(const char* s, T t)
{
ostringstream o;
o << s << "(" << t << ")" << " " << __PRETTY_FUNCTION__;
return o.str();
}
VERSATILE_LITERAL(_id, id)
VERSATILE_LITERAL(_ego, id)
VERSATILE_LITERAL(_superego, id)
int main() {
cout << 123_id << endl;
cout << 123._ego << endl;
cout << "hello"_superego << endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3N0cmVhbT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgVkVSU0FUSUxFX0xJVEVSQUwoc3VmZml4LCBpbXBsZW1lbnRhdGlvbikgXAogIGF1dG8gb3BlcmF0b3IgIiIgc3VmZml4KHVuc2lnbmVkIGxvbmcgbG9uZyB4ICAgICAgICAgICAgKSB7IHJldHVybiBpbXBsZW1lbnRhdGlvbigjc3VmZml4LCB4KTsgfSBcCiAgYXV0byBvcGVyYXRvciAiIiBzdWZmaXgobG9uZyBkb3VibGUgICAgICAgIHggICAgICAgICAgICApIHsgcmV0dXJuIGltcGxlbWVudGF0aW9uKCNzdWZmaXgsIHgpOyB9IFwKICBhdXRvIG9wZXJhdG9yICIiIHN1ZmZpeChjaGFyICAgICAgICAgICAgICAgeCAgICAgICAgICAgICkgeyByZXR1cm4gaW1wbGVtZW50YXRpb24oI3N1ZmZpeCwgeCk7IH0gXAogIGF1dG8gb3BlcmF0b3IgIiIgc3VmZml4KHdjaGFyX3QgICAgICAgICAgICB4ICAgICAgICAgICAgKSB7IHJldHVybiBpbXBsZW1lbnRhdGlvbigjc3VmZml4LCB4KTsgfSBcCiAgYXV0byBvcGVyYXRvciAiIiBzdWZmaXgoY29uc3QgY2hhciogICAgICAgIHgsIHNpemVfdCBsZW4pIHsgcmV0dXJuIGltcGxlbWVudGF0aW9uKCNzdWZmaXgsIHgpOyB9IFwKICBhdXRvIG9wZXJhdG9yICIiIHN1ZmZpeChjb25zdCB3Y2hhcl90KiAgICAgeCwgc2l6ZV90IGxlbikgeyByZXR1cm4gaW1wbGVtZW50YXRpb24oI3N1ZmZpeCwgeCk7IH0gXAovL2VuZG1hY3JvCgp0ZW1wbGF0ZTxjbGFzcyBUPiBzdHJpbmcgaWQoY29uc3QgY2hhciogcywgVCB0KQp7Cglvc3RyaW5nc3RyZWFtIG87CglvIDw8IHMgPDwgIigiIDw8IHQgPDwgIikiIDw8ICIgIiA8PCBfX1BSRVRUWV9GVU5DVElPTl9fOwoJcmV0dXJuIG8uc3RyKCk7Cn0KCgpWRVJTQVRJTEVfTElURVJBTChfaWQsIGlkKQpWRVJTQVRJTEVfTElURVJBTChfZWdvLCBpZCkKVkVSU0FUSUxFX0xJVEVSQUwoX3N1cGVyZWdvLCBpZCkKCmludCBtYWluKCkgewoJY291dCA8PCAxMjNfaWQgPDwgZW5kbDsKCWNvdXQgPDwgMTIzLl9lZ28gPDwgZW5kbDsKCWNvdXQgPDwgImhlbGxvIl9zdXBlcmVnbyA8PCBlbmRsOwp9Cg==