Извинения, если название немного вводит в заблуждение. Вот ситуация.
Рассмотрим следующий пример:
template<typename T>
static std::string demangle_typename()
{
int status = 0;
return abi::__cxa_demangle(typeid(T).name(),nullptr,nullptr,&status);
}
void foo()
{
typedef const int* Type;
std::cout<< demangle_typename<Type>() <<std::endl; // type is: int const * <ok>
}
Тип: int const *
Сейчас Когда я удаляю часть const *
, используя std::remove_pointer
, а я использую std::add_pointer
, чтобы добавить указатель обратно без const
, константность появляется снова. Почему?
void foo()
{
typedef const int* Type;
std::cout<< demangle_typename<Type>() <<std::endl; // type is: int const * <ok>
typedef typename std::remove_pointer<Type>::type rp_Type; // int
typedef typename std::add_pointer<rp_Type>::type p_Type; // int const * <???>
std::cout<< demangle_typename<p_Type>() <<std::endl; // type is: int const * <???>
}
Чтобы получить указатель без const
Мне нужно использовать std::remove_const
. Но зачем это нужно, поскольку std::remove_pointer
уже удалил const
?
void foo()
{
typedef const int* Type;
std::cout<< demangle_typename<Type>() <<std::endl; // type is: int const * <ok>
typedef typename std::remove_pointer<Type>::type rp_Type; // int
typedef typename std::remove_const<rp_Type>::type rc_Type; // int
typedef typename std::add_pointer<rc_Type>::type p_Type; // int*
std::cout<< demangle_typename<p_Type>() <<std::endl; // type is: int* <ok>
}
Пример кода онлайн: https://rextester.com/YYE94945