如何从数据类型中删除所有const限定符?
我尝试使用std::remove_cv
,但它没有用。
std::remove_cv< const char *>::type
是否与std::remove_cv<char*>::type
不一样?
感谢。
答案 0 :(得分:4)
特质正在做正确的事情:
const char*
与char const*
相同,与char* const
不同。所以在你的情况下,指针是const
,而不是指针。并且remove_const
(有点逻辑上)只删除外部const
,而不删除内部{。}。
如果你真的想删除指针对象的const
,你可以这样做:
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>>>;
更具可读性。
答案 1 :(得分:1)
没有标准的方法可以做到这一点,你需要自己编写:
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;
};
答案 2 :(得分:0)
递归地做。在专业化中匹配T*
,然后重新应用*
等
答案 3 :(得分:0)
您可以看到常量指针和指向const的指针之间的差异以及带有
的各种type_traits
#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