我有一个模板类似这样的:

template<T>
class MyClass
{
  T* data;
}

有时候,我想到使用这类用恒定类型的T如下:

MyClass<const MyObject> mci;

但是我想要的修改数据的使用 const_cast<MyObject*>data (它不是重要的,为什么但是 MyClass 是一个参考数的明智指针类保留基准计在数据本身。 MyObject 来自一些类型,其中包含计数。该数据不应该被修改,但是该计数必须修改通过的明智的指针。).

有没有一种方法来消除常量性从 T?虚构的代码:

const_cast<unconst T>(data) 

?

有帮助吗?

解决方案

最简单的方法在这里是使参考计数可变的。

不过,如果你有兴趣它将如何与const_cast工作,那么重写升压转换器的remove_const应该是很简单的:

template <class T>
struct RemoveConst
{
    typedef T type;
};

template <class T>
struct RemoveConst<const T>
{
    typedef T type;
};

const_cast<typename RemoveConst<T>::type*>(t)->inc();

其他提示

您有答案了。 const_cast会工作在两个方向:

char* a;
const char* b;

a = const_cast<char*>(b);
b = const_cast<const char*>(a); // not strictly necessarily, just here for illustration

至于你具体的问题,你认为是可变的关键字?它允许一个成员变量到一个const方法内进行修改。

class foo {
    mutable int x;
public:
    inc_when_const() const { ++x; }
    dec_when_const() const { --x; }
};

请引用计数在你的侵入指针管理类可变。这是完全合理的,并反映“逻辑常量性”正是正确的 - 即改变对象的引用计数不能反映对象本身的状态发生任何变化。换句话说,引用计数在逻辑上不是对象的一部分 - 对象恰好是存储此半无关的数据的方便的地方

如果你可以使用提升,所类型特征的图书馆提供的 remove_const 元函数,这样做的。

这里是我的C++11 unconst 功能 template.

如果你用它,你是调情 未定义的行为.你已经 警告.

// on Ubuntu (and probably others) compile and test with                                                        
//   g++ -std=c++11 test.c  &&  ./a.out  ;  echo $?                             

template < class T >  T &  unconst  ( T const & t ) {
  return  const_cast < T & >  ( t ) ; 
}

// demonstration of use

struct {
  const int n = 4;
} s;

int main () {
  unconst ( s.n ) = 5;
  return s.n;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top