概念とは、型に対する一連の要件です。たとえば、operator[](int)
O(1) 時間で実装する型に要件を課す「RandomAccessible」という概念を作成できます。
概念は次期 C++ 標準から削除されたため、C++ にはドキュメントとして無形にしか存在しません。例として、コンテナの概念に関する SGI の説明を読むことができます。
型が概念のすべての要件を満たしている場合、その型をその概念のモデルと呼びます。たとえばstd::vector
、コンテナの概念のモデルです (または、同等のstd::vector
「モデル」コンテナ)。
最後に、ポリシーは動作の単位であり、他の動作単位と組み合わせて複雑なクラスを構築できます。たとえば、固定サイズの配列と動的にサイズ変更可能な配列の 2 つのクラスを構築するとします。これらのクラスは両方とも多くの共有機能を持っていますが、ストレージ メカニズムと一部の機能が異なるだけです (たとえばpush_back
、固定サイズの配列を呼び出すことはできません)。
template <class T, class StoragePolicy>
class array : public StoragePolicy
{
public:
T& operator[](int i) { return data[i]; }
};
template <class T, int N>
class fixed_storage
{
T data[N];
};
template <class T>
class dynamic_storage
{
T* data;
public:
void push_back(const T& value)
{
// Code for dynamic array insertion
}
};
使用法は次のようになります。
int main()
{
array<int, fixed_storage<int, 10> > fixed_array;
array<int, dynamic_storage<int> > dynamic_array;
dynamic_array.push_back(1);
fixed_array[9] = dynamic_array[0];
}
明らかに、これは非常に粗雑で不完全な例ですが、ポリシーの背後にある概念を明らかにすることを願っています.
この例では、fixed_storage
とが概念dynamic_storage
の「モデル」であると言えます。StoragePolicy
もちろん、StoragePolicy
その概念がそのモデルに要求するものを正確に定義する必要があります。この場合、インデックス可能なdata
メンバー変数を定義するだけです。