質問

私はテンプレートクラスのようになります:

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

時には、使いたい、シェイクスピアの"マクベス"一定のシリコーンコーティング処理をしており

MyClass<const MyObject> mci;

していきたいと思っているデータの利用 const_cast<MyObject*>data (が重要ではないかも MyClass は参照カウントスマートポインタークラスの参照カウントのデータそのものです。 MyObject から一部の型の数です。のデータの改変を行うことはできませんが、カウント変更手続きが必要となるスマートポインタです。).

があるので、削除constらしさから 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; }
};

あなたの侵入ポインタによって管理クラスの参照カウントが変更可能にします。これは完全に合理的である、そして正確に正しく「論理的const性」を反映した - すなわち、オブジェクトの参照カウントがオブジェクト自体の状態の変化を反映していない変更します。言い換えれば、参照カウントは論理的にオブジェクトの一部ではありません - オブジェクトは、ちょうどこの半無関係なデータを格納するための便利な場所であることを起こる。

あなたはブーストを使用することができた場合は、

、タイプトレイトライブラリは<のhref = "http://www.boost.org/doc/libs/1_40_0/libs/type_traits/doc/html/boost_typetraits/reference/remove_constを提供します。それを行うのhtml」のrel = "nofollowをnoreferrer"> 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