删除模板C ++中的const限定符

时间:2012-12-16 16:00:16

标签: c++ const

如何从数据类型中删除所有const限定符?

我尝试使用std::remove_cv,但它没有用。

std::remove_cv< const char *>::type

是否与std::remove_cv<char*>::type不一样?

感谢。

4 个答案:

答案 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