const_castにテンプレートを作成します。はありまunconst修飾子?
-
19-09-2019 - |
質問
私はテンプレートクラスのようになります:
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;
}