読者です 読者をやめる 読者になる 読者になる

渡米生活。(日記)

渡米生活。本家から切り離しました。あまり渡米生活に関係のないプログラムネタや音楽ネタなど。

(boost) shared_ptrから生ポインタをgetする

いきなり、boostの趣旨に反するtipsから。
(行末が切れてたらフォントサイズをおとして下さい)

いくら生pointerを追放しろと言われても、どーしても生ポインタを使いたいことはある!(特にdebug時)
で、boost/shared_ptr.hppを見ると、

T * get() const;

とかいうやつがいて、ちゃんと生pointerを返してくれる関数があるわけです。
ところが、こいつをよく考えずに、

using namespase boost;
...
// shared_ptrの作成
shared_ptr<MyParticle> particlePtr(new MyParticle()); 

// 生pointerのget
MyParticle* raw_ptr = particlePtr->get();

とかやっちゃうと、"そんな関数知らん"とコンパイラに怒られて終わりです。
これですっかり意気消沈して暫く生ポインタへの情熱から遠ざかっていたんですが、よくよく考えてみたら、shared_ptr::get()はshared_ptrテンプレートの関数なんですよね。
一方、shared_ptr::operator->()は、shared_ptrが保存してる生ポインタ(この場合MyParticleオブジェクトへのポインタ)を返すので、これではダメなのは明白。で、正しくは、

MyParticle* raw_ptr = particlePtr.get();

です。

どうってことない、というか、さっさと気付けよ、というレベルのtipsなんですが、boostの精神に反するためか、googleっても具体的な事例はあまりありません。

ちなみに、私の環境では、何故か、

MyParticle* raw_ptr = particlePtr.boost::shared_ptr::get();

ではダメでした。面倒なのでusing namespaseしてしまいましたが、何がいかんのか不明。
namespaceあんまりよく分かってないから、そもそも用法が間違ってるのかもしれん…

後日談。

このエントリは、別ブログから引っ越してきたのですが、後日コメントを頂きました。

「通りすがり」さんから

MyParticle* raw_ptr = particlePtr.boost::shared_ptr::get();

ならいけるはずです。(^o^)

……全くその通りでした。。おはずかしい。。。