2012-11-20 3 views
4

std :: remove_const는 const3800을 제거 할 수 없습니다. const char*. 이 프로그램의'char const *'에서 const를 제거하는 방법

#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(); 
} 

출력 (비주얼 스튜디오 2010) :

char const * 
char const * 

그리고 GCC에서 우리가 읽을 수있는 출력을

(코드 here) :

PKc 
PKc 

다음 코드를 고려 Microsoft 컴파일러의 두 번째 줄에 char *을 얻으 려하고 gcc의 모든 내용 (첫 줄과 다를 수 있음)을 얻으려고합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? char const*char*으로 변경하려면 어떻게해야하나요?

+5

'문자의 CONST이 *'이다 const에 대한 포인터, 그것은 const 자체가 아닙니다. – Pubby

+0

게시 한 코드는'typename std :: remove_const ... '없이 gcc에서 컴파일되지 않습니다. – Praetorian

+0

예, gcc 컴파일러에 typename을 추가해야했습니다. gcc의 코드는 다음과 같습니다. http://ideone.com/Vd25T8 – Uri

답변

6

당신이 재귀 적으로 모든 수준에서 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'; 
} 
+0

Asker가 이것을 원한다면 좋은 생각입니다. –

+0

아주 좋아 ...... – Uri

8

char const*const char에 대한 포인터이지만 포인터 자체는 const이 아닙니다. 지적되는 유형의 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, konst에 대한 char에 대한 C 및 K)

관련 문제