Singletonクラスのアクセスを簡単にマルチスレッド対応させたい
Singletonクラスを作るたびにそのクラスのメンバ変数としてMutexとかを宣言したくないんです。冗長だし。
Lock, UnLockの方法もきっと面倒なんですよね。アクセスするたびにロックを手動で書くような。
そういったものを書かせないで、これまでみたいにget_instanceメソッドを呼び出してアクセスできるような形にしたい。
ということで、そんな感じの物を書いてみました。C++0x無いと動きません。GCC4.4(boost1.43.0), MSVC10(boost1.44.0)で確認しました。
(boost1.43.0はrvalue referenceに対応できてないので冗長なコードが混ざってます)
ちゃんと定義しておくべきだろうなというのがいくつか欠けてる気がしますが…。
本当ならポリシーベースにするべきなのかな、と思ったのですが、今書いてるライブラリがマルチスレッドを以外と使う事になってるので別にいいかってなりました。
あ、一応ポリシーベースで作ってあるのですが、正しいのかちょっと不安なので検証してから…(おい
rvalue referenceが無ければ実装するのはちょっと面倒でしたね。
呼び出し側でインスタンスを持っておく場合はauto iとかでも可能なようになってます。
ポインタである理由はまあ色々ありますが、単純にこれまでのライブラリでのシングルトンのget_instance関数の戻り値が全部生ポインタだったからです。
上記の例だとinstance_typeになりますが、これを書き換えるだけでいい様に、呼び出し側を書き換えなくていいようにしたかっただけです。
それに.演算子はオーバーロードできませんしね。
boost::mutexがstatic変数になってますが、singleton_ptr
後はポリシー化して、マルチスレッドかシングルスレッドか、アクセスポリシーを指定可能なように作れば後は完璧ですかねえ。