1

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

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

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

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

谢谢。

4

4 回答 4

5

特征是正确地做所有事情:

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>>>;

更具可读性。

于 2012-12-16T16:13:48.070 回答
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;
};
于 2012-12-16T16:25:18.090 回答
0

您可以看到常量指针和指向 const 的指针之间的区别以及各种type_traitswith

#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

于 2012-12-16T16:23:38.523 回答
0

递归执行。匹配T*一个专业,然后重新应用*,等等。

于 2012-12-16T16:09:26.350 回答