11

また、programmers.stackexchange.com で:

STL の概念が存在する必要があり、それらを「クラス」または「インターフェイス」と呼ぶのはばかげていることを理解しています。実際には、それらは文書化された (人間の) 概念にすぎず、当時は C++ コードに変換できませんでした。しかし、概念に対応するために言語を拡張する機会が与えられた場合、クラスの機能や導入されたインターフェースを単純に変更しなかったのはなぜでしょうか?

概念はインターフェイス (データのない 100% 抽象クラス)に非常に似ていませんか? それを見ると、インターフェースは公理のサポートを欠いているだけのように思えますが、公理をC++のインターフェースに導入できるかもしれません(概念を引き継ぐためにC++でインターフェースを仮想的に採用することを検討してください)、そうではありませんか?自動の概念でさえ、そのような C++ インターフェースに簡単に追加できると思います (自動インターフェースの LessThanComparable、誰ですか?)。

concept_mapは Adapter パターンに非常に似ていませんか? すべてのメソッドがインラインである場合、アダプタは基本的にコンパイル時以降存在しません。コンパイラは、インターフェイスへの呼び出しをインライン バージョンに置き換えるだけで、実行時にターゲット オブジェクトを直接呼び出します。

静的オブジェクト指向プログラミングと呼ばれるものについて聞いたことがあります。これは本質的に、汎用プログラミングでオブジェクト指向の概念を効果的に再利用することを意味し、実行オーバーヘッドを発生させることなく OOP のほとんどの機能を使用できるようにします。このアイデアがさらに検討されなかったのはなぜですか。

これが十分に明確であることを願っています。私がそうではないと思われる場合は、これを書き直すことができます。私に知らせて。

4

4 に答える 4

6

OOP とジェネリック プログラミング、 Predestinationの間には大きな違いがあります。

OOP では、クラスを設計するときに、便利だと思われるインターフェースが用意されていました。そして、それは完了です。

一方、ジェネリック プログラミングでは、クラスが特定の一連の要件 (主にメソッドだけでなく、内部の定数や型も含む) に準拠している限り、そのクラスは要求に適合し、使用することができます。コンセプトの提案は、メソッド本体をインスタンス化するときではなく、メソッド署名をチェックするときに直接検出が行われるように、これを形式化することに関するものです。また、概念が一致しない場合、一部のメソッドはインスタンス化せずに拒否される可能性があるため、テンプレート メソッドのチェックがより簡単になります。

Concepts の利点は、Predestination に悩まされないことです。Library1 からクラスを選択し、Library2 からメソッドを選択できます。適合する場合はゴールドです (適合しない場合は、概念を使用できる場合があります)。地図)。オブジェクト指向では、毎回本格的なアダプタを作成する必要があります。

どちらも似ているように見えるのは正しいです。違いは主にバインディングの時間に関するものです (また、Concept にはインターフェイスのような動的ディスパッチではなく静的ディスパッチがあるという事実もあります)。コンセプトがよりオープンになり、より使いやすくなりました。

于 2011-09-02T06:34:53.540 に答える
3

クラスは、名前付き適合の形式です。から継承することにより、クラスFooがインターフェイスに準拠していることを示します。II

概念は、構造的および/または実行時の適合性の形式です。クラスFooは、どの概念に準拠しているかを前もって述べる必要はありません。

その結果、名前付き適合性により、クラスが使用可能であっても、事前に予期されていなかった場所でクラスを再利用する機能が低下します。

于 2011-09-02T08:19:03.203 に答える
1

概念は実際には C++ の一部ではなく、単なる概念です! C++ では、「概念を定義する」方法はありません。あなたが持っているのは、templates とclasses だけです (STL は、名前が示すように、すべてのテンプレート クラスです: S tardard T emplate Library )。

C++ ではなく C++0x を意味する場合 (この場合、タグを変更することをお勧めします)、こちらをお読みください。

http://en.wikipedia.org/wiki/Concepts_(C++ )

いくつかの部分をコピーして貼り付けます。

保留中の C++ プログラミング言語の C++0x リビジョンでは、公理の概念と関連する概念は、C++ のテンプレート システムの拡張として提案され、コンパイラの診断を改善、プログラマがテンプレートのいくつかの正式なプロパティをプログラムで成文化できるようにするために設計されました。あの人たちは書く。これらの限定された正式な仕様をプログラムに組み込むことは (コードの明瞭度を向上させることに加えて) 、コンパイラーの最適化を導くことができ、正式な検証ツールを使用して実装と仕様が実際に一致することを確認することで、プログラムの信頼性を向上させるのに役立つ可能性があります。

2009 年 7 月、 C++0x 委員会は、C++0x の「準備ができていない」と見なされている概念を標準草案から削除することを決定しました。

概念の導入の主な動機は、コンパイラ エラー メッセージの品質を向上させることです。

ご覧のとおり、概念はインターフェイスなどを置き換えるものではなく、コンパイラがより適切に最適化し、より適切なエラーを生成するのに役立つだけです。

于 2011-09-02T08:32:27.550 に答える