ウィキペディアで存在型の定義 ( Existential_types ) を見ていましたが、C++ の概念 (特に概念 lite )に何らかの形で似ているように感じます。
C++ の概念は存在型の形式ですか?
そうでない場合、2つの違いは何ですか?
ウィキペディアで存在型の定義 ( Existential_types ) を見ていましたが、C++ の概念 (特に概念 lite )に何らかの形で似ているように感じます。
C++ の概念は存在型の形式ですか?
そうでない場合、2つの違いは何ですか?
TL;DR : はい、概念は (または少なくとも定義できるようにする) 存在型です。
これが私の推論ですが、注意してください。私は型理論家ではありません。
ウィキペディアの抽象データ型の定義を考えてみましょう(強調は私のものです):
コンピューター サイエンスでは、抽象データ型 (ADT) は、セマンティクスが似ている 1 つ以上のプログラミング言語の特定のクラスのデータ型の数学モデルです。抽象データ型は間接的に定義され、それに対して実行される可能性のある操作と、それらの操作の効果 (および場合によってはコスト) に対する数学的制約によってのみ定義されます。
これらの 2 つのスタック オーバーフローの質問とリンクしたウィキペディアの記事で説明されているように、存在型は、パラメーター化された定義を使用して抽象データ型をモデル化する方法のようです。重要なことに、これらのパラメーターは結果の存在型の一部ではありません。
一方、概念は額面どおり、テンプレートを制限するために使用できる 1 つ (ゼロ?) または複数の型の述語です。句を検討するまで、それらが存在型と何らかの関係を持っていることは明らかではありませんrequires
。
基本的に、requires
型の特定のプロパティをテストできます。これらの中には、特定のメンバー型を定義するかどうか、特定のメンバー関数を持っているかどうか、特定の型に変換できるかどうかなどがあります。この観察 (実際には設計の要点) が問題の核心です。
少なくとも私には、基本的に概念とは、抽象データ型を定義するためのメカニズムであると思われます。ここから、存在型との類似性が見え始めます。これらはパラメーター化によって ADT をモデル化し、さらに重要なことに、パラメーターを公開せずに ADT を定義できるようにします。
Container
たとえば、コンセプトを考えてみましょう。Concepts Lite を使用すると、次のように書くことができます。
void print (Container c) {
for (const auto& e : c)
print (e);
}
// Later
print (std::vector <int> {1, 2, 3, 4});
これは、の他の制約とともに、式が type のオブジェクトを返す ような型が存在するために機能します。それは存在量化です。存在感のあるタイプです。I
begin (c)
end (c)
I
Container
Container
私の知る限り、C++ の概念は任意の型の述語です。C++ の概念に関する作業は、特定の意味を与えたり、数学的/論理モデルを指定したりすることよりも、これらの述語を言語に統合する方法に集中しています。アイデアは、まさに関数として
void f(double x);
double
このような簡単な方法で、タイプ のパラメーターを明らかに期待しています
template <Container C>
void f(const C& c);
typename
だけでなく、を期待していContainer
ます。では、 はどのようにContainer
定義されるのでしょうか。それは例えば
template <typename T>
struct Container: std::false_type { };
template <typename T, size_t N>
struct Container <std::array<T, N> >: std::true_type { };
template <typename T, typename A>
struct Container <std::vector<T, A> >: std::true_type { };
等々。のような述語はContainer
現在存在しますが、それらをテンプレート関数に統合するには、 のような不便な構造が必要std::enable_if
です。コンセプトにより、これがよりクリーンで使いやすくなります。
これもまた、大まかに私の理解です。