5.3. ステートレスポリシー

ステートレスポリシーは、内部状態を持ってはならないという制約を課されたポリシークラスである。より正確には、次の条件を満たすポリシークラスを指す。

また、非静的メンバ関数とprotectedメンバは意味をなさないため、公開インタフェースはすべてpublicな静的メンバ関数である。静的メンバ関数は、純粋な演算のみを行うか、ポリシークラス外への副作用をもたらす。ホストクラスは、publicな静的メンバ関数の呼び出しによってこのポリシークラスを使用する。

ステートレスポリシーは、大域関数のまとまりをテンプレートパラメータ経由でホストクラスに渡す手段として利用される。以下に例を示す。

例 5.11. ステートレスポリシー

template <class EXP>
class error_reporting_policy_throw
{
private:
  ~error_reporting_policy_throw(); // nonconstructible
public:
  static void error() { throw EXP(); }
};

class error_reporting_policy_ignore
{
private:
  ~error_reporting_policy_ignore(); // nonconstructible
public:
  static void error() {}
};

template <typename T, class ERP>
container
{
private:
  typedef ERP error_reporting_policy;
public:
  // ...
private:
  void foo_() { if (...) error_reporting_policy::error(); }
  class internal_class_
  {
    // ...
    void bar_() { if (...) error_reporting_policy::error(); }
  };
};

error_reporting_policy_throwerror_reporting_policy_ignoreは、ステートレスポリシーを用いたエラー報告ポリシーである。メンバ関数errorは、呼び出されるとエラーを報告する何らかの副作用を発生させるか、あるいは単に無視をする(何もしない)。

ホストクラスcontainerは、静的メンバ関数を直接呼び出すことでエラー報告ポリシーを使用する。継承あるいは合成はしない。静的メンバ関数の呼び出し以外に実行時の時間的・空間的コストが発生しないことは、ポリシーによって保証される。

項5.1. 「ポリシークラス」で述べたような継承を用いたポリシークラスでは、その機能を使用するためには派生クラスになる必要がある。ステートレスポリシーにはその制約がなく、ポリシーのクラス名と定義を知るだけで使用できる。上記の例ではホストクラスの内部クラスinternal_class_がエラー報告ポリシーを使用している。