似乎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();
}
Run Code Online (Sandbox Code Playgroud)
此程序的输出(在Visual Studio 2010上):
char const *
char const *
Run Code Online (Sandbox Code Playgroud)
在gcc中我们有可读的输出(代码在这里):
PKc
PKc
Run Code Online (Sandbox Code Playgroud)
我希望得到char *第二行的Microsoft编译器,以及gcc上的任何(但不同于第一行).我究竟做错了什么?如何打开char const*来char*?
char const*是指向a的指针const char,但指针本身不是const.要从指向的类型中删除constness,您可以这样做:
std::add_pointer<typename std::remove_const<typename std::remove_pointer<T>::type>::type>::type
Run Code Online (Sandbox Code Playgroud)
或者:
typename std::remove_const<typename std::remove_pointer<T>::type>::type*
Run Code Online (Sandbox Code Playgroud)
我们将指针从const char*get中const char删除,然后删除const以获取char,然后将指针添加回get 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;
Run Code Online (Sandbox Code Playgroud)
在我的系统上使用g ++,输出:
PKc
Pc
Run Code Online (Sandbox Code Playgroud)
这应该会给你一个关于"PKc"含义的暗示.P代表指针,c代表char,K代表konst;)
如果要删除所有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';
}
Run Code Online (Sandbox Code Playgroud)