#include <iostream>
#include <typeinfo>
#include <cxxabi.h>
std::string dm(const std::string& name)
{
int status;
return std::string(abi::__cxa_demangle(name.c_str(), 0, 0, &status));
}
using namespace std;
template <typename T>
using remove_const_if_pointer_to_const =
std::conditional_t<std::is_pointer<T>::value,
std::add_pointer_t<std::remove_const_t<std::remove_pointer_t<T>>>,
T>;
int main() {
using A = int;
using B = int*;
using C = const int*;
std::cout << dm(typeid(remove_const_if_pointer_to_const<A>).name()) << std::endl;
std::cout << dm(typeid(remove_const_if_pointer_to_const<B>).name()) << std::endl;
std::cout << dm(typeid(remove_const_if_pointer_to_const<C>).name()) << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZWluZm8+CiNpbmNsdWRlIDxjeHhhYmkuaD4KCnN0ZDo6c3RyaW5nIGRtKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKQp7CglpbnQgc3RhdHVzOwoJcmV0dXJuIHN0ZDo6c3RyaW5nKGFiaTo6X19jeGFfZGVtYW5nbGUobmFtZS5jX3N0cigpLCAwLCAwLCAmc3RhdHVzKSk7Cn0KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KdXNpbmcgcmVtb3ZlX2NvbnN0X2lmX3BvaW50ZXJfdG9fY29uc3QgPSAKCXN0ZDo6Y29uZGl0aW9uYWxfdDxzdGQ6OmlzX3BvaW50ZXI8VD46OnZhbHVlLAoJCXN0ZDo6YWRkX3BvaW50ZXJfdDxzdGQ6OnJlbW92ZV9jb25zdF90PHN0ZDo6cmVtb3ZlX3BvaW50ZXJfdDxUPj4+LAoJCVQ+OwoKCgoKaW50IG1haW4oKSB7CgoJdXNpbmcgQSA9IGludDsKCXVzaW5nIEIgPSBpbnQqOwoJdXNpbmcgQyA9IGNvbnN0IGludCo7CiAgICAKCXN0ZDo6Y291dCA8PCBkbSh0eXBlaWQocmVtb3ZlX2NvbnN0X2lmX3BvaW50ZXJfdG9fY29uc3Q8QT4pLm5hbWUoKSkgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8IGRtKHR5cGVpZChyZW1vdmVfY29uc3RfaWZfcG9pbnRlcl90b19jb25zdDxCPikubmFtZSgpKSA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgZG0odHlwZWlkKHJlbW92ZV9jb25zdF9pZl9wb2ludGVyX3RvX2NvbnN0PEM+KS5uYW1lKCkpIDw8IHN0ZDo6ZW5kbDsKICAgIAoJcmV0dXJuIDA7Cn0=