boostライブラリのunspecifiedを解読するbool_type

1614 ワード

boostのスマートポインタ(scoped_ptr,scoped_array,shared_ptr,shared_arrayを含む)では、クラスごとにメンバー関数(関数と呼ぶ)operator unspecified_bool_type()const、しかもpublicなので、ソースコードを見たことがあると、どのように使うか迷うかもしれませんが、下にソースコードを貼ってください.
  typedef T * this_type::*unspecified_bool_type;

  operator unspecified_bool_type() const // never throws
  {
    return ptr == 0? 0: &this_type::ptr;
  }

スマートポインタクラスのオブジェクトを定義し、if文でオブジェクトが空のポインタであるかどうかを判断すると(まず次のコードを参照)、戸惑うかもしれません.
  scoped_ptr<A> ptr(new A);
  
  if (ptr)
  {
    // ...
  }

少なくとも私はかつてこのような困惑があって、理解できないので、それを解読しました.上の2つの困惑は実は1つの問題で(早めにあなたに教えてあげます~)、boostスマートポインタのbool文脈に対する支持で、スマートポインタがbool文脈を支持するのは、使用上原始ポインタに近づくためです.
まず次の言葉から解読します.
typedef T * this_type::*unspecified_bool_type;
この文はthisを指すことを宣言しています.typeクラスメンバー変数のポインタのタイプ.クラスメンバー変数を指すポインタのタイプを宣言します.タイプクラス名:*ポインタのタイプです.クラスメンバー関数を指すポインタを参照できますか.
これについてtype,scoped_ptrコードにtypedef scoped_がありますptr this_type;
このコードで得られた情報は次のとおりです.
1) unspecified_bool_typeは変数ではなくタイプで、typedefによって知られています.
2) unspecified_bool_typeはscoped_ptrクラスのメンバー変数のタイプ.このメンバー変数のタイプはT*です.
次に、この関数を分析します.
  operator unspecified_bool_type() const // never throws
  {
    return ptr == 0? 0: &this_type::ptr;
  }

多くのプログラマーがここで詰まっていると信じています.少なくとも私は.なぜならoperatorキーワードがオペレータの再ロードのほかに、暗黙的なタイプ変換であることを知らないからです.間違いありません.フォーマットはこうです.
operator type() {
...
}
if(ptr)を実行するとoperator unspecified_が実行されます.bool_type()const,転嫁判断unspecified_bool_typeタイプのポインタが空かどうか.
(完)