値か,安全な参照か,素の参照か

値を持つか,他のオブジェクトへの参照を取るか,他のオブジェクトへの life time 管理付き参照を取るか,つーのを,生成の仕方で変更できるクラスってありかにゃ〜.

// X への参照もしくは値を持つアダプタ
class Adaptor
{
public:
  // 値を保持するのと等価なモード,
  // つまり (Adaptor の寿命) = (X のオブジェクトの寿命)となるモード
  Adaptor()
    : p_owner_ship_holder_( new X() )
    , rx_( *p_owner_ship_holder_ )
  {}

  // X への参照を保持するモード.ライフタイム管理なし.
  Adaptor( X &x )
    : p_owner_ship_holder_( NULL )
    , rx_( &x )
  {}

  // X への参照を保持するモード.ライフタイム管理あり.
  Adaptor( boost::shared_ptr< X > const &px )
    : p_owner_ship_holder_( px )
    , rx_( *px )
  {}

private:
  boost::shared_ptr< X > p_owner_ship_holder_;
  X &rx_;
};

あ〜,実際に書きくだしてみたらすごくダメな気がしてきた.少なくとも実行時に求めるべき汎用性じゃないな,これ.どう考えても over-generalization な希ガス.やっぱコンパイル時の型でころころかえるべきか.そもそも上と下2つ意味が全然異なるし.でも,下2つは共存してても……あ,やっぱダメ.却下.

値 <-> 参照(lifetime 管理アリ) <-> 参照(lifetime 管理なし)

っつー行き来をもうちょっと楽にしたいんだけどにゃ〜.あ,でもこれ行き来で変わるのって Adaptor の生成のインタフェースだけなのか.じゃあもう型で分けて #ifdef とかで良いか…….
#というか恐ろしく眠い状態で思いついたことをフィルタリングせずに書いてるから明日起きて見直したらすごい馬鹿なことを書いていると思うに違いない.