如何从数据类型中删除所有 const 限定符?
我尝试使用std::remove_cv
但没有用。
std::remove_cv< const char *>::type
不是一样std::remove_cv<char*>::type
吗?
谢谢。
特征是正确地做所有事情:
const char*
与 相同char const*
,也不与 相同char* const
。所以在你的情况下,它是指针,const
而不是指针。并且remove_const
(从逻辑上讲)只删除外部的const
,而不是内部的。
如果你真的想删除const
指针的ness,你可以这样做:
using T = char const*;
using NoConstT = std::add_pointer<std::remove_cv<std::remove_pointer<T>::type>::type>::type;
(虽然std::add_pointer<T>::type
可以放弃以支持更简单的T*
......)
即:移除指针,移除const
指针对象的,将结果再次变成指针。
事实上,这是使用R. Martinho Fernandes 出色的Wheels库的好机会,它为此类嵌套特征提供了方便的快捷方式:
#include <wheels/meta.h++>
using namespace wheels;
…
using NoConstT = AddPointer<RemoveCv<RemovePointer<T>>>;
更具可读性。
没有标准的方法可以做到这一点,您需要自己编写:
template<typename T> struct remove_const_recursive { typedef T type; };
template<typename T> struct remove_const_recursive<T const volatile> {
typedef typename remove_const_recursive<T>::type volatile type;
};
template<typename T> struct remove_const_recursive<T volatile> {
typedef typename remove_const_recursive<T>::type volatile type;
};
template<typename T> struct remove_const_recursive<T const> {
typedef typename remove_const_recursive<T>::type type;
};
template<typename T> struct remove_const_recursive<T&> {
typedef typename remove_const_recursive<T>::type& type;
};
template<typename T> struct remove_const_recursive<T*> {
typedef typename remove_const_recursive<T>::type* type;
};
您可以看到常量指针和指向 const 的指针之间的区别以及各种type_traits
with
#include <iostream>
#include <type_traits>
int main()
{
std::cout << std::is_same<std::remove_const<const char*>::type, char*>::value << '\n';
std::cout << std::is_same<std::remove_const<char* const>::type, char*>::value << '\n';
std::cout << std::is_same<std::add_pointer<std::remove_const<std::remove_pointer<const char*>::type>::type>::type, char*>::value << '\n';
return 0;
}
作为输出
0
1
1
递归执行。匹配T*
一个专业,然后重新应用*
,等等。