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ブーストの再実装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();
于 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

特定の問題に関しては、変更可能なキーワードを検討しましたか? 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 に答える