2011-07-05 7 views
4

dynamic_castshared_ptrを使用する場合は、dynamic_pointer_castを使用できます。 auto_ptrをキャストするにはどうすればよいですか?私は以下のようなものを想定しています。auto_ptrとdynamic_pointer_cast

struct B : A { }; 
... 
auto_ptr<A> base(...); 
auto_ptr<B> derive = dynamic_pointer_cast<B>(base); 

私は、コピーをauto_ptrの性質上のshared_ptrの

+0

間違った方法はありますか?派生( 'A')から基底(' B')へ 'dynamic_cast'する必要はありません。 –

+0

@Luc、はい、ありがとう。 –

答えて

4
auto_ptr<A> base(...); 
if(B* query = dynamic_cast<B>(base.get())) { 
    // take ownership 
    base.release(); 
    auto_ptr<B> derived(query); 

    // use and/or pass derived around here 
    // ... 
} else { 
    // no dice: leave base as owner 
} 

...それでdynamic_pointer_cast作業を行うことにより、非推奨の機能の利用を促進するつもりはありませんあなたの選択は、その日それを呼び出す:

// Postcondition: 
// where r is the returned pointer and p == from.get() 
// EITHER r == 0 AND from.get() == p 
// OR r.get() == dynamic_cast<To>(p) AND from == 0 
template<typename To, typename From> 
std::auto_ptr<To> 
dynamic_pointer_cast(std::auto_ptr<From>& from) 
{ 
    To* query = dynamic_cast<To>(from.get()); 
    return query ? from.release(), query : 0; 
} 
+0

これは私が今行っていることです。それをするの。 –

+0

@ edA-qa AFAICT独自のポインタ(つまり、 'boost :: scoped_ptr'、' std :: auto_ptr 'や' std :: unique_ptr')のポインタキャストと同等のものはありません。 –

1

ためのブーストを使用して(あなたは使用しないでください。あるいは、あなたがそれを使用する必要がある場合は、構築物をコピーすることはありませんかコピー割り当てること)をしています動くのと同じです。したがって、所有権を譲渡せずにキャストを行う方法はありません。これにより、前の所有者は所有権を失います。

auto_ptr(つまり、失敗したことを意味するdynamic_cast)が返された場合はどうなりますか?キャストのおかげで、ポインタの元の所有者は所有権を失っています。キャストに失敗したため、新しい所有者にはポインタがありません。誰がそれを所有するのだろうか?

しかし、あなたは、あなたが必要とする任意のポインタタイプに対してdynamic_pointer_castを部分的に特化できると確信しています。

また、auto_ptrはC++ 0xでは非推奨です。あなたはすでにそれをリファクタリング、ことをやっているので、標準化委員会は、の名前空間でそれを平手打ち、

+0

「決して....コピーを割り当てない」と言ったときの意味を指摘するのに役立つかもしれません(RVOの「移動」割り当てとおそらくパラメータ渡しのtempsを許可していますか?) – sehe

+0

私は持っていないのでC++ 0xコンパイラ私はしばらくの間、 'auto_ptr'を使い続ける必要があります。オーナーシップは私には明らかです。キャストが失敗した場合、オブジェクトは単に削除されます(元のものが所有権を失うようにptrを割り当てています)。 –

1

をそれは次のように行くだろう:

auto_ptr<Derived> pd(
    dynamic_cast<Derived*>(base.get())? static_cast<Derived*>(base.release()) : 0 
    ); 

所有権移転が発生したかどうかを確認します。

resetオリジナルの場合は、auto_ptrとし、例外をスローします。

特に以来auto_ptrのMicrosoftの実装は、が標準で保証の変換に依存しないにとって重要な、非常に不安定となって、そしておそらくまだありました。

乾杯& HTH。タイプAおよびBのために周り、

+0

私はダイナミックチェックの後でスタティックキャストが本当に好きです。 – mskfisher

関連する問題