1 #include "../gintenlib/new_.hpp"
5 // というより、簡単な使い道を説明する程度のコード。
12 void hoge( const boost::shared_ptr<T>& ptr )
21 // shared_ptr を受け取る関数があるとする。例えば上の hoge だ。
22 // この手の関数に、新しく作ったオブジェクトを入れたい。
24 // hoge( new int(23) );
25 // こう書ければいいが、生ポインタから shared_ptr への暗黙変換は不可能である。
27 // そこでこう書き、明示的に変換して渡すこととなる。
28 hoge( boost::shared_ptr<int>( new int(23) ) );
30 // これは型名 int が二回使われていて冗長である。ここで new_ を使えば
31 hoge( gintenlib::new_<int>( 42 ) );
32 // と書ける。多くのプログラマは、これを自然と感じるのではないだろうか。
34 // また、これは例外安全性の観点からも重要である。
35 // 詳しくは http://boost.cppll.jp/HEAD/libs/smart_ptr/shared_ptr.htm#BestPractices を参照。
36 // gintenlib::new_ は、この問題を非常にうまく扱うことが出来る。
39 // また gintenlib::new_ は、それ以外からの構築を禁止するようなクラスを簡単に作成できる。
40 // その一番の使い道は、boost::enable_shared_from_this を使う場合だろう。
41 // gintenlib::new_ 以外で構築できないクラスは、確実に shared_ptr に格納されるからである。
42 // これらには二つの実装法がある。順に見てみよう。
44 #include <boost/enable_shared_from_this.hpp>
48 : boost::enable_shared_from_this<force_shared1>
50 ~force_shared1() throw () {}
54 cout << "force_shared1::foo();\n";
58 // private に全てのコンストラクタを置き、一般からの構築を禁止
60 // その上で gintenlib::new_core_access 構造体を friend に指定する
61 friend class gintenlib::new_core_access;
67 : boost::enable_shared_from_this<force_shared2>,
68 gintenlib::enable_static_new_<force_shared2> // これを指定する
70 ~force_shared2() throw () {}
76 // enable_static_new_<クラス名> から継承させることで、
77 // new_ による構築は、そのクラスの静的関数 new_ を通して行われるようになる
78 static boost::shared_ptr<force_shared2> new_()
80 cout << "force_shared2::new_();\n";
81 return boost::shared_ptr<force_shared2>( new force_shared2() );
84 static boost::shared_ptr<force_shared2> new_( int )
86 cout << "force_shared2::new_( int );\n";
87 return boost::shared_ptr<force_shared2>( new force_shared2() );
91 // 同様に private に全てのコンストラクタを置き、一般からの構築を禁止
99 // 使う分にはその差を意識することはない。
100 boost::shared_ptr<force_shared1> p1 = gintenlib::new_<force_shared1>();
103 boost::shared_ptr<force_shared2> p2 = gintenlib::new_<force_shared2>(),
104 p3 = gintenlib::new_<force_shared2>( 0 );