8

我有一个这样的模板类:

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

有时,我想使用具有常量类型 T 的类,如下所示:

MyClass<const MyObject> mci;

但我想修改数据使用const_cast<MyObject*>data(这并不重要,但它MyClass是一个引用计数智能指针类,它将引用计数保留在数据本身中。MyObject派生自包含计数的某种类型。数据不应该被修改,但是count 必须由智能指针修改。)。

有没有办法从 const-ness 中删除T?虚构代码:

const_cast<unconst T>(data) 

?

4

5 回答 5

14

这里最简单的方法是使引用计数可变。

但是,如果您对它如何与 . 一起使用感兴趣const_cast,那么重新实现 boostremove_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();
于 2009-10-04T15:22:33.133 回答
7

你有答案。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

至于您的具体问题,您是否考虑过 mutable 关键字?它允许在 const 方法中修改成员变量。

class foo {
    mutable int x;
public:
    inc_when_const() const { ++x; }
    dec_when_const() const { --x; }
};
于 2009-10-04T14:44:37.170 回答
4

在由侵入式指针管理的类中使引用计数可变。这是完全合理的,并且完全正确地反映了“逻辑常数”——即改变对象的引用计数并不反映对象本身状态的任何变化。换句话说,引用计数在逻辑上不是对象的一部分——对象恰好是存储这些半不相关数据的方便位置。

于 2009-10-04T15:17:54.233 回答
3

如果您可以使用 Boost,Type Traits 库会提供remove_const元函数来执行此操作。

于 2009-10-04T14:50:48.550 回答
0

这是我的 C++11unconst函数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;
}
于 2014-05-30T20:13:15.540 回答