ステートレスポリシーは、内部状態を持ってはならないという制約を課されたポリシークラスである。より正確には、次の条件を満たすポリシークラスを指す。
また、非静的メンバ関数と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_throwとerror_reporting_policy_ignoreは、ステートレスポリシーを用いたエラー報告ポリシーである。メンバ関数errorは、呼び出されるとエラーを報告する何らかの副作用を発生させるか、あるいは単に無視をする(何もしない)。
ホストクラスcontainerは、静的メンバ関数を直接呼び出すことでエラー報告ポリシーを使用する。継承あるいは合成はしない。静的メンバ関数の呼び出し以外に実行時の時間的・空間的コストが発生しないことは、ポリシーによって保証される。
項5.1. 「ポリシークラス」で述べたような継承を用いたポリシークラスでは、その機能を使用するためには派生クラスになる必要がある。ステートレスポリシーにはその制約がなく、ポリシーのクラス名と定義を知るだけで使用できる。上記の例ではホストクラスの内部クラスinternal_class_がエラー報告ポリシーを使用している。