2016-04-29 15 views
10

Parametric PolymorphismためのWikipediaのページによると:なぜC++はパラメトリック多型をサポートしないと言われていますか?

もアドホック側面を導入しながら型多型のいくつかの実装は、パラメトリック多型に表面的に類似しています。 1つの例は、C++テンプレートの特殊化です。

質問:なぜCがあるが++ paramaterized多型に似た何かを実装するだけに言いましたか?特に、テンプレートはパラメトリック多形性の完全な例ではありませんか?

+0

この質問への答えにかかわらず、そのウィキペディアページには多くの愛が必要です... – Barry

+1

そのwikiページは、理論の観点から来ています - 型理論の厳密な数学的仕様であり、したがって、 "パラメトリック多形"厳密な定義があります。 C++のテンプレートは、柔軟性があります。そのような理論よりも柔軟性があります。したがって、おそらくもっと便利です!確かにもっと興味深い!とにかく、私はいつも「アドホック多型」と呼ばれるC++テンプレートを聞いてきました。 – davidbak

答えて

1

なぜC++は、パラメータ化された多態性とは表面的に似ていますか?特に、テンプレートはパラメトリック多形性の完全な例ではありませんか?

C++のテンプレート関数は、パラメータの「置換」に基づいて動作します。基本的には、コンパイラがテンプレート引数が関数にハードコードされている関数の別のバージョンを生成することを意味します。 int add(int a, int b) { return a + b; }double add(double a, double b) { return a + b; } 一つの機能はONLY int型を処理する、もう一方はONLYダブルスを処理する2つの関数になりますよう、コンパイル中

template <typename T> 
T add(T a, T b) { 
    return a + b; 
} 

int main() { 
    int i = add(2, 3); 
    double d = add(2.7, 3.8); 
    return i + (int)d; 
} 

は、あなたがC++でこれを持っていると仮定します。多型はありません。

実際は、引数のバリエーションの数だけ実装されます。

なぜこのパラメトリック多型ですか?」と聞くかもしれませんか?

バイナリの '+'演算子をオーバーロードする独自のバリエーションを呼び出すには、 'add'関数の完全なソースコードが必要です。 - それはです。違いをもたらす詳細はです。

C++に適切なパラメトリック多形性があった場合、たとえば、C#のように最終的にコンパイルされた 'add'の実装には、実行時に 'add'に受け入れられるパラメータに対して '+'そして、あなたが発明した新しいタイプで呼び出すために、その関数のソースコードは必要ありません。

これは実際にはどういう意味ですか?

しかし、C++があまり強力でないか、C#がより強力であるかのように理解できません。これは単に多くの言語機能の詳細の1つです。

テンプレート化された関数のソースがあれば、C++のセマンティクスははるかに優れています。自由に静的ライブラリまたは動的ライブラリのみを使用できる場合は、パラメトリック多形実装(C#など)が優れています。

1

リンク先の記事でそのことが説明されています。あなたが実際に引用したテキストは、C++のテンプレートを純粋なパラメトリック多相性とは別に設定したものの1つの例です:C++テンプレートの特殊化。

はこのテーマに継続する:クリストファー・ストレイチー、

[2]パラメトリック多型が単一の多型関数によって異なる、潜在的に異種の実装の数を有することが可能な、ad hoc polymorphismと対比することができますそれが適用される引数の型に依存します。したがって、アドホック多型は、一般的に、限られた数のこのような異なるタイプをサポートすることができる。これは、それぞれのタイプごとに別々の実装が提供されなければならないからである。

説明したよう、C++のテンプレートは—に近づいたが、正確に—パラメトリック多型ではありません。

関連する問題