2

C++ と Java は、パラメトリック ポリモーフィズムの処理方法に類似点があります。どちらも、型パラメーターを通常の関数またはメソッドに推論しますが、プログラマーはコンストラクターを呼び出すときに型パラメーターを明示的に指定する必要があります (ただし、これは Java 7 で変更されました)。

この動作の背後にある技術的な理由は何ですか?

編集:これはScalaにも当てはまると誤って考えました。Java の例を次に示します。

class Foo<T> {
    Foo(T x) { }
}

<T> void foo(T x) { }


Foo<Integer> f = new Foo(3);
foo(3);

これらはどちらも有効ですが、最初のものは ではなく「生の型」を作成しFoo<Integer>、未チェックの代入を実行します。

4

1 に答える 1

3

これは、C++ テンプレートを特殊化できるためです。

それは、主な定義があるという理由だけでそれを意味します:

template<typename T>
class Foo
{
    Foo(T x) { }
};

intによって受け入れられることは明らかですがFoo<int>(int)、特殊な定義も存在する可能性は十分にあります。

template<>
class Foo<Foobar>
{
    Foo(int x) { }
};

パラメータも受け入れintます。

ユーザー定義の型変換をミックスに追加すると、関数の引数からクラスの型パラメーターを把握することが不可能であることがわかります。

実際、コンストラクターの型パラメーターの推論は許可されています。ただし、クラス テンプレート パラメーターの推論ではありません。たとえば、スマート ポインターを構築するときに暗黙的なアップキャストを許可します。

template<typename T>
class a_smart_ptr
{
    template<typename TOther>
    a_smart_ptr(TOther* p) { }
};
于 2013-12-20T05:19:19.527 に答える