2009-03-09 11 views
71

static_castと同等のものはboost::shared_ptrとなりますか?言い換えればstatic_cast?

、どのように私はshared_ptrを使用する場合は、以下の

Base* b = new Derived(); 
Derived* d = static_cast<Derived*>(b); 

を書き換えなければならないのですか?

boost::shared_ptr<Base> b(new Derived()); 
boost::shared_ptr<Derived> d = ??? 
+22

それは'ベース* B =新しい派生()をすべきではないが定義されていませんか? – legends2k

答えて

104

使用boost::static_pointer_caststatic_pointer_castdynamic_pointer_cast、そしてconst_pointer_cast

boost::shared_ptr<Base> b(new Derived()); 
boost::shared_ptr<Derived> d = boost::static_pointer_cast<Derived>(b); 
+0

static_pointer_castについて知らずに、まず生のポインタをキャストして再ラッピングしようとしました。だから私はそれがstackoverflowにこの情報を持っていると便利だと思います。 – Frank

+4

'boost :: static_pointer_cast (b)'も 'Base'が暗黙的に使われるので、使用することもできます。 – dalle

+4

私はあなたがこれを使用していて、Derivedクラスが完全に含まれていない(つまり、それが前方宣言されている)場合、あなたは非常に役に立たない "invalid type conversion:" Base * "から" Derived * ""それは私がそれを考え出した前に画面を見てかなり長い時間がかかりました:) –

22

スマートポインタのための3つのキャスト演算子があります。名前空間boost<boost/shared_ptr.hpp>)または名前空間std::tr1(BoostまたはコンパイラのTR1実装によって提供される)のいずれかにあります。

3

コメント:Derivedが実際にBaseから派生している場合は、静的キャストではなくdynamic_pointer_castを使用する必要があります。あなたのキャストが間違っているかどうかを検出する機会があります。

+0

Baseに仮想メンバーがなくても、システムはこれを検出できません。 Dynamic_castは、仮想メンバーを持つクラスでのみ不思議です。 – Aaron

+0

また、パフォーマンスが低下します。キャストが常に成功することが本当にわかっている場合、static_castは実行時オーバーヘッドなしで動作します。 –

+0

...ランタイムオーバーヘッドなし*通常は*。私は詳細を思い出すことはできませんが、仮想多重継承やその他のコーナーケースでは、技術的にオーバーヘッドがありますが、dynamic_castよりもまだ少ないです。 –

2

BoostとTR1の実装で提供されるキャスト演算子の数に違いがあることは言うまでもありません。 `;

TR1は、第三オペレータconst_pointer_cast()

+0

[this reference](http://en.cppreference.com/w/cpp/memory/shared_ptr/pointer_cast)によると、 'const_pointer_cast'はC++ 11で利用可能です。 –

関連する問題