6

std::remove_constはのconst-nessを削除できないようです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コンパイラの2行目、およびgccの1行目とは異なるものを取得したいと思います。私は何が間違っているのですか?どうすればいいchar const*ですchar*か?

4

2 に答える 2

9

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*getへのポインタを削除しconst char、次にgetへのconstを削除してから、getcharへのポインタを追加し直します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はKkonst

于 2012-11-20T18:15:20.790 に答える
8

すべての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';
}
于 2012-11-20T18:28:53.747 に答える