たとえば、C ++のテンプレートの概念は、コンパイラがクラスまたは関数のために追加のコードを生成するため、快適さのためです。したがって、追加の(手作業)を行うことで、テンプレートなしで生活することができます。
仮想関数はどうですか?
両方がかけがえのない状況はありますか?
たとえば、C ++のテンプレートの概念は、コンパイラがクラスまたは関数のために追加のコードを生成するため、快適さのためです。したがって、追加の(手作業)を行うことで、テンプレートなしで生活することができます。
仮想関数はどうですか?
両方がかけがえのない状況はありますか?
はい、より多くの手作業を行うことで、テンプレートなしで生活できます (コンパイラーが作成するコードを作成するか、void*
型の仕様を削除するために使用します)。
そうです、(switch ステートメントを使用するか、独自の vtable 構造体を格納するなどして) より多くの手作業を行うことで、ポリモーフィズムなしで生活できます。
それらがかけがえのない場合はありますか?
テンプレートとポリモーフィズムのアプローチにより、型の安全性と、一部の手動メソッドでは置き換えることができないコンパイラ強制動作 (純粋仮想など) が得られます。たとえば、はで動作std::sort
するよりも安全に使用できます。これらの手動の方法では、バグをなくして維持する必要のあるコードが大量に発生する可能性があります。したがって、「かけがえのない」の定義に依存します。これらの機能の有無にかかわらず、これらの言語は依然としてチューリング完全です。理論的には、チューリング完全言語では何でも計算できるので、理論的にはすべての言語を BrainF*ck に置き換えることができます...そうしないことを選択しただけです ;)qsort
void*
まったく同じではありません。
テンプレートは、コンパイル時にさまざまなシグネチャを持つ関数を効果的に生成します。すべての同等のメソッドを自分で簡単にコピーして貼り付けるか、コードを生成することができます。
仮想メソッドは、実行時に決定を下すために使用されるため、プログラマーの作業を容易にしますが、置き換えるのはかなり困難です。コードをコピーして貼り付けて仮想関数をシミュレートすることはできませんが、代わりに、関数ポインターの vtable のようなテーブルまたはその他の代替アプローチを使用して、ほぼ同じことを自分で実装する必要があります。
要するに、仮想関数を使用すると、他の方法では困難ないくつかのことを簡単に実行できますが、それはテンプレートが影響を与えるものとは異なるセットです。
もちろん; ポリモーフィズムが利用可能になる前であり、現在でもポリモーフィズムを理解していない人々のコードでは、Giant Switch ステートメントがその役割を果たしています。
テンプレートと同じ目的を達成するためにポリモーフィズムを使用することが可能であることがわかりました。ただし、より多くの作業が必要になると思われる場合は、これを行います。パフォーマンスや保守性など、考慮すべき他のトレードオフがあります。私がどちらに行くかを決めるとき、それらは関係してくる。
AND 操作と NOT 操作で必要なことはすべて実行できると思います。他のすべては肉汁です。