3.3.9. pfi::lang::safe_bool

3.3.9.1. 概要

boolとして評価したいクラスを作りたいときに使う。

3.3.9.2. 使い方

class A : public safe_bool<A>{
public:
  bool bool_test() const { return ...; }
};

safe_bool<A>から”public”継承させる。 safe_boolのパラメータには自分を渡す (このような手法はCRTPなどと呼ばれる)。

それから、publicメンバ関数として、bool bool_test() constな関数を実装する。 これでAをboolとして評価できるようになる。

A a, b;
if (a){ ... } // ok!
if (a<b){ ... } // compile error!
hoge(a); // compile error!

3.3.9.3. operator bool() では駄目な理由

キャスト演算子を定義すると、その型への暗黙の変換が生じる。

class A{ public: operator bool() const { return ... } };

このようなクラスがあると、

A a, b;
if (a<b){ // compile OK!
  ...

この様なコードがコンパイルを通ってしまう。 boolへの変換を定義しても、 この様なコードが通るのはプログラマの意図に反するものである可能性が高い。 また、intを受け取る関数にも渡せるようになってしまう。

int hoge(int a){ ... }

int main(){
  A a;
  cout<<hoge(a)<<endl; // compile OK!
  ...

safe_boolを用いると、 このような意図しない暗黙の変換によって予期せぬコードが コンパイルを通ってしまう状況を防ぐことができる。