#include <iostream>
#include <typeinfo>
template<class T>
struct printer {
friend std::ostream &operator<<(std::ostream &output, const printer&) {
return output << typeid(int).name();
}
};
template<class T>
struct printer<T&> {
friend std::ostream &operator<<(std::ostream &output, const printer&) {
return output << typeid(int).name() << "&";
}
};
template<class T>
struct printer<T&&> {
friend std::ostream &operator<<(std::ostream &output, const printer&) {
return output << typeid(int).name() << "&&";
}
};
int main(int argc,char *argv[])
{
std::cout << printer<int>() << std::endl;
std::cout << printer<int&>() << std::endl;
std::cout << printer<int&&>() << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZWluZm8+Cgp0ZW1wbGF0ZTxjbGFzcyBUPgpzdHJ1Y3QgcHJpbnRlciB7ICAgIAogICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSAmb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0gJm91dHB1dCwgY29uc3QgcHJpbnRlciYpIHsKICAgICAgICByZXR1cm4gb3V0cHV0IDw8IHR5cGVpZChpbnQpLm5hbWUoKTsKICAgIH0KfTsKCnRlbXBsYXRlPGNsYXNzIFQ+CnN0cnVjdCBwcmludGVyPFQmPiB7ICAgIAogICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSAmb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0gJm91dHB1dCwgY29uc3QgcHJpbnRlciYpIHsKICAgICAgICByZXR1cm4gb3V0cHV0IDw8IHR5cGVpZChpbnQpLm5hbWUoKSA8PCAiJiI7CiAgICB9Cn07Cgp0ZW1wbGF0ZTxjbGFzcyBUPgpzdHJ1Y3QgcHJpbnRlcjxUJiY+IHsgICAgCiAgICBmcmllbmQgc3RkOjpvc3RyZWFtICZvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSAmb3V0cHV0LCBjb25zdCBwcmludGVyJikgewogICAgICAgIHJldHVybiBvdXRwdXQgPDwgdHlwZWlkKGludCkubmFtZSgpIDw8ICImJiI7CiAgICB9Cn07CgppbnQgbWFpbihpbnQgYXJnYyxjaGFyICphcmd2W10pCnsKCXN0ZDo6Y291dCA8PCBwcmludGVyPGludD4oKSA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgcHJpbnRlcjxpbnQmPigpIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCBwcmludGVyPGludCYmPigpIDw8IHN0ZDo6ZW5kbDsKfQo=