短い答え:コンパイル前とコンパイル時に、目的に類似性のある概念が混在しています。インターフェイス(抽象クラスとすべてのオブジェクト指向パラダイム実装)は、コンパイル時に適用されます。概念は同じアイデアですが、汎用プログラミングのコンテキストでは、C ++ではコンパイル時の前に発生します。最後の機能はまだありません。
しかし、最初から説明させてください。
長い答え:
実際、コンセプトは単なる言語の強制であり、言語にすでに存在するものを「プログラマーにとってより簡単に」するものであり、「ダックタイピング」と呼ぶことができます。
型をテンプレート関数に渡すと、それはコンパイラが呼び出されたときに実際の(インライン)コードを生成する汎用関数であり、その型にはテンプレートコードで使用されるいくつかのプロパティ(特性?)が必要です。したがって、ダックタイピングのアイデアですが、すべてコンパイル時に生成および実行されます。
型に必要なプロパティがない場合はどうなりますか?
まあ、コンパイラーは、テンプレートから生成されたコードがコンパイルされて失敗した場合にのみ問題があることを認識します。つまり、生成されるエラーはテンプレートコード内のエラーとなり、プログラマーにエラーとして表示されます。また、テンプレートのコード生成の場合に提供されるメタ情報のため、エラーの情報は大量にあり、どのテンプレートのインスタンス化について話しているのかを知ることができます。
これに関するいくつかの問題:まず、ほとんどの場合、テンプレートコードはライブラリコードであり、ほとんどのプログラマーはライブラリコードのユーザーではなく、ライブラリコードのユーザーです。つまり、ライブラリがどのように記述されているか(デザインだけでなく、実際にどのように実装されているか)を理解していないと、この種の不可解なエラーを理解するのは非常に困難です。2番目の問題は、プログラマーがテンプレートコードを作成した場合でも、コンパイラーが問題が遅すぎると通知できるため、生成されたコードがコンパイルされているときに、失敗の理由がわかりにくい場合があることです。問題がタイププロパティに関連している場合は、コードを生成する前でもチェックする必要があります。
これがコンセプトで許可されている(および設計されている):(汎用コード)プログラマーがテンプレートパラメーターとして渡される型のプロパティを指定できるようにし、提供された型が要件を満たさない場合にコンパイラーが明示的なエラーを提供できるようにします要件。
チェックが成功すると、コードがテンプレートから生成され、コンパイルされます。
すべての概念チェックは、コンパイル時の前にのみ行われます。オブジェクトのタイプではなく、タイプ自体をチェックします。コンパイル前のオブジェクトはありません。
さて、「インターフェース」について。
抽象または仮想基本型を作成すると、それを使用するコードで、実際の実装を知らなくても、子型のオブジェクトを操作できます。これを実施するために、基本型は仮想であり、子型によってオーバーロードされる可能性がある(またはオーバーロードされる必要がある)メンバーを公開します。
つまり、コンパイラは、基本クラスへの参照を必要とする関数に渡されるすべてのオブジェクトが1.基本クラスの子タイプの1つである必要があること、2。その子タイプの実装が必要であることをコンパイル時にチェックできることを意味します。存在する場合、基本クラスで宣言された仮想純関数。
したがって、コンパイル時に、コンパイラーはオブジェクトのタイプのインターフェースをチェックし、何かが欠落しているかどうかを報告します。
これはConceptsと同じアイデアですが、Conceptの説明で述べたように、遅すぎます。コンパイル時に発生します。汎用コード(テンプレートコード)を使用していないため、処理が完了し、仮想基本クラスでは公開できない型が汎用要件を満たしているかどうかを確認するのはもう遅すぎます。実際、C ++のオブジェクト指向パラダイムの実装全体は、テンプレートコードが処理されているときには存在しません。(まだ)オブジェクトはありません。それは
クラスは、オブジェクトを操作する関数の要件をチェックするために使用されるオブジェクトの制約を記述します。概念は、型(クラスを含む)の制約を記述し、これらの型と汎用コードの組み合わせから実際のコードを生成するための汎用コードの要件を確認するために使用されます。
つまり、やはり「健全性チェック」と同じですが、言語の別のレイヤーであるテンプレートです。テンプレートは、コンパイルされたコードに表示される前でもメタプログラミングやプログラミングタイプを可能にする完全な(チューリング完全な)言語です。コンパイラのスクリプトを書くのと少し似ています。それをスクリプト化できるとしましょう。クラスはスクリプトによって操作される単なる値です。現在、これらの値の制約を確認する方法は、明白ではない方法でスクリプトをクラッシュさせる以外にありません。概念はそれだけです。これらの値にタイプを提供します(生成されたコードではタイプです)。よくわからない...
仮想基本クラスとコンセプトのもう1つの非常に重要な違いは、最初のタイプはタイプ間の強い関係を強制し、それらを「血に縛られる」ようにすることです。テンプレートメタプログラミングでは「ダックタイピング」が可能ですが、コンセプトでは要件をより明確にすることができます。