Как удалить const из ‘char const *’

Похоже, что std :: remove_const не может удалить постоянство const char*, Рассмотрим следующий код:

#include <iostream>
#include <type_traits>
#include <typeinfo>

template< typename T >
struct S
{
static void foo( ) {
std::cout << typeid(T).name() << std::endl;
std::cout << typeid( std::remove_const<T>::type ).name() << std::endl;
}
};int main( )
{
S<char const*>::foo();
}

Вывод этой программы (на Visual Studio 2010):

char const *
char const *

И в GCC у нас есть читаемый вывод (код Вот):

PKc
PKc

Я бы надеялся получить char * во второй строке компилятора Microsoft, и что угодно (но отличается от 1-й строки) в gcc. Что я делаю неправильно? Как мне повернуть char const* в char*?

5

Решение

Если вы хотите удалить все квалификаторы const, вам нужно решение, которое рекурсивно удаляет const со всех уровней:

template<typename T> struct remove_all_const : std::remove_const<T> {};

template<typename T> struct remove_all_const<T*> {
typedef typename remove_all_const<T>::type *type;
};

template<typename T> struct remove_all_const<T * const> {
typedef typename remove_all_const<T>::type *type;
};

int main() {
std::cout << typeid(remove_all_const<int const * * const>::type).name() << '\n';
}
8

Другие решения

char const* это указатель на const char, но сам указатель не const, Чтобы удалить константность из указанного типа, вы можете сделать это:

std::add_pointer<typename std::remove_const<typename std::remove_pointer<T>::type>::type>::type

Или в качестве альтернативы:

typename std::remove_const<typename std::remove_pointer<T>::type>::type*

Убираем указатель с const char* получить const char, затем удалите const, чтобы получить char, затем добавьте указатель обратно, чтобы получить char*, Не особенно красиво. Тестировать:

typedef const char * type_before;
std::cout << typeid(type_before).name() << std::endl;
typedef typename std::remove_const<typename std::remove_pointer<type_before>::type>::type* type_after;
std::cout << typeid(type_after).name() << std::endl;

С g ++ в моей системе это выводит:

PKc
Pc

Это должно дать вам подсказку о том, что означает «PKc». P для указателя, c для charи К для konst 😉

8

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector