6

これら 3 つの概念の正確かつ簡潔な定義を 1 か所で知りたいです。回答の質は、次の 2 点に依存する必要があります。

  1. コンセプト/テクニックがどのように、また何のために使用されているかを示す簡単なコード スニペットを示します。
  2. この分野に触れていないプログラマーが理解できるように、理解するのに十分なほど単純にしてください。

ノート:

それぞれの概念には多くの異なる側面があるため、おそらく多くの正解があります。良い回答がたくさんある場合は、最終的に質問を CW に変えて回答を集計します。

-- 投稿承認編集 --

Boost には、ジェネリック プログラミングの概念に関する優れた記事があります。

4

3 に答える 3

8

概念とは、型に対する一連の要件です。たとえば、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メンバー変数を定義するだけです。

于 2010-02-06T16:20:41.923 に答える
2

概念とは、概念をモデル化するために型が満たさなければならない一連の要件です。

たとえば、型TとはLessThanComparable、オブジェクトab型のペアのTa < bが整形式であり、変換可能でboolあり、厳密な弱い順序関係を誘導する場合です。型式intは の型式の一例ですLessThanComparable

概念は絞り込み階層を形成できます。の要件が の要件のスーパーセットである場合、概念Aは概念の改良版です。たとえば、は の改良版です。BABBidirectionalIteratorForwardIterator

概念は、テンプレートを特殊化できる型のセットを制限するために使用されます。たとえば、std::sortアルゴリズムは、オブジェクトがモデル化されている限り、オブジェクトのペアを受け入れることができますRandomAccessIterator

std::vector<int> vec;
std::list<int> list;

// OK, std::vector<int>::iterator is a model of `RandomAccessIterator`.
std::sort(vec.begin(), vec.end());

// error, std::list<int>::iterator is only a model of `BidirectionalIterator`.
std::sort(list.begin(), list.end());

概念は、C++ 標準およびその他のさまざまなドキュメントで使用される非公式のオブジェクトであることに注意してください。言語は概念を直接サポートしていません (まだ)。

于 2010-02-06T16:04:54.580 に答える
2

Ao SGI のドキュメントでは、C++0x 提案で「概念」として導入されたものとして「モデル」を参照しています。これは、オブジェクト指向モデリングにおける「インターフェース」と同等のコンパイル時です。これは、テンプレート パラメーターに対する一般的なコード ポーズの要件をまとめたものです。

例として、関数が機能するためには、関数のOutputIteratorパラメーターをstd::transform実装する必要があると言えます。operator++()operator=( T )

ポリシーは別のものです。それはアルゴリズムを外部から変更可能にします。良い例はAllocator、stl コンテナーのあまり使用されないパラメーターです。これは、メモリの割り当て方法をアルゴリズムに指示します。std::vector<int, AllocateOnCloud>必要に応じて、関数全体がvectorヒープではなくクラウドにメモリを割り当てるを作成できます。(私はこのアロケータを実装する傾向がありません、心)。

于 2010-02-06T16:09:24.793 に答える