shared_ptrでつかまえて♪(boost::shared_ptr + std::vector)

また超いらんものを作りました.
smart_vector.hpp
ぶっちゃけvectorそのまんまです.外側から扱っている限り,vectorとまったく区別がつかないコンテナです.が,コード見てもらえば分かりますが,各要素をboost::shared_ptrで捕捉しています.難しいことは何もしてないはず(唯一allocator + shared_ptrという組み合わせが珍しいかも)なので,詳しいことはコード読んでください.ちなみに,このクラスによる恩恵は以下.

  • 各メソッドやiteratorなどがすべからくvectorと同じ動きなので,vector >よりも使い方が(多分)楽(vectorとも交換も楽)
  • value_typeが(copyするのに)重い型の場合に,これを軽量に動作させることが(多分)可能
  • value_typeに多相的に扱える型を指定することにより,多相的なコンテナを作れる(はず)

自分としては多相的に扱える型はポインタとして明示的に示すべきだと思うので,個人的には好きじゃない使い方です.もちろん,値のやりとりは全てreferenceかconst_reference経由なので多相的に扱う場合に問題は出ないとは思います

  • value_typeに対する内部ハンドルが,vectorに対するmutableな操作で無効化されるのを避ける(ことが出来たら良いなぁ)

自分の目的としては,コンテナのコンテナで内側のコンテナのiteratorが外側のvectorに対するpush_backなどで無効化されるのを防ぎたかったというのがありました.ちなみにこれは外側のsmart_vectoriteratorの安定性を保証するものではありません.

  • vector >ではvalue_typeのデフォルトコンストラクトがboost::shared_ptr(0)だが,これに対してTのデフォルトコンストラクタ(+それに対する動的メモリ確保)が常に呼ばれる(ような気もする)

だって,いちいちnewするのちょ〜めんどくさいんだも〜ん(・ 3 ・)〜♪

欠点は以下

  • 動的メモリ管理使うんだから当然その分のoverloadは(ものすごく)かさみます

ただし,標準コンテナと同じくAllocatorによるカスタマイズを可能にしてあります.
(´-`).。oO(vectorに対するallocatorとvalue_typeに対するallocatorを別々に指定できるようにしたほうが良いのかな・・・)
おわり.
追記:上に書いた利点のうち1,2,4,5番が欲しいだけならlistやslist使っても良いのですが,RandomAccessContainerである必要があるならvector + shared_ptrという解の必要性が出てきます.(で,実際自分はそうだった.)