8

この質問は、パラダイムに関連するものであり、いくつかの概念を明確にしようとしているだけだということから始めたいと思います。だから私はPythonで約2年間プログラミングしており、つま先をJavaに浸しましたが、あまり多くはありません.C ++を掘り下げたいと思っています。以前に使用したことがありますが、多くの設計が関係する大規模なプロジェクトには使用しませんでした。

私が最初に調査を開始したとき、すべてがインターフェイスを実装する必要がある Java と同様に、OOP に対応していると信じていました。次に、テンプレートの概念にぶつかりました。これは、それを実装していないプリミティブ(intsfloats)にポリモーフィックな動作を提供するための回避策であるとすぐに考えました(基本的に、Pythonがダックタイピングと正式なインターフェースなしで行ったこと)。しかしすぐに、非プリミティブ型に同じ動作を提供するためにテンプレートが使用されていることがわかりました。

私の質問は、テンプレートよりも古典的なポリモーフィズムを使用する理由は何ですか? C++ コミュニティでは、これに対する一般的なアプローチは何ですか?

編集質問にほぼ答えるこれを見つけました(静的ポリモーフィズム、この用語に頭を悩ませる必要があります)。

4

1 に答える 1

8

全面的な一般化を行うリスクがありますが、テンプレートはほとんど Java の Generics と同様に使用されます。テンプレートを使用すると、多くの異なるデータ型で使用できるクラスまたは関数を構築できます。std::list標準テンプレート ライブラリの一部である を取得します。で整数の連結リストを作成しstd::list<int>たり、 でオブジェクトのリストを作成したりできますstd::list<MyClass>。もう 1 つの例は ですstd::thread。これは、テンプレートを使用して関数 (またはラムダまたはファンクター) とその引数を取得し、別のスレッドで実行します。

f(SomeInterface x)関数と関数テンプレートのどちらを選択するかについてはf(T x)、実際にはコンテキストに依存し、やや主観的です。考慮すべき事項は次のとおりです。

  • 関数テンプレートとクラス テンプレートはコンパイル時に解決されるため、パフォーマンスが向上する可能性があります。でも、

  • C++ コンパイラは、歴史的に、テンプレート エラーに対してかろうじて判読可能なガベージを生成します。Clang はこれを改善するためにいくつかの作業を行っており、他のコンパイラは Clang に匹敵するように改善されています。状況は良くなっていますが、それでもかなり醜いです。

  • インターフェイスと実装クラスで従来のポリモーフィズムを使用することを恐れないでください。場合によってはポリモーフィズムの代わりにテンプレートが使用されますが (テンプレートを使用する C++とインターフェイスを使用するstd::threadJava を参照)、ポリモーフィズムは C++ ライブラリおよびプロジェクトでは依然として非常に一般的です。ThreadRunnable

要するに、テンプレートの使用を自由に検討してください。一般的な C++ ライブラリを見てみると、多くのポリモーフィズムが見つかるはずです。人気のある C++ グラフィック エンジンである OGRE を取り上げます。そのクラス リストを見ると、ユーザーがライブラリと対話するためにクラスを派生できる多くのインターフェイス ( や など) が見つかりますWindowEventListenerFrameListener

于 2012-11-19T16:28:48.480 に答える