問題タブ [static-polymorphism]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 静的ポリモーフィズムはインターフェイスの実装に意味がありますか?
そして皆さん、メリークリスマス!
私は静的ポリモーフィズムについて学んでおり、ポリシーベースの設計に関する Andrei Alexandrescu の優れた本を読んでいます。コードで次のことに遭遇しました。メソッドが存在する必要があることInterface
を指定するインターフェイスがあります。Foo
このインターフェイスは、クラスによって実装されImpl
ます。次の 2 つのオプションがあります。
1) 動的多型
2) 静的多型
この場合、静的ポリモーフィズムを使用することは理にかなっていますか? 2 番目のアプローチは、最初のアプローチと比較して利点がありますか? インターフェースはいくつかのメソッドの存在のみを指定し、そのメカニズムは異なる実装でも同じです。そのため、本で説明されているケースとはまったく異なり、物事を複雑にしすぎているだけかもしれません.
更新:実行時にポリモーフィックな動作は必要ありません。正しい実装はコンパイル時に認識されます。
c++ - コンパイル時に基本クラスを見つける
タイトルはほとんどすべてを言います: C++ でコンパイル時にクラスの基本型を取得する方法はありますか? 私はe。クラスをテンプレートに渡し、そのテンプレートに、指定されたクラスのベースを渡す他のテンプレートを使用させることは可能ですか?
私の質問は、そのような機能を自分で実装できるかどうかではなく、(特性などを使用して) 実装できることに疑問の余地はありません。私の質問は、この目的のために使用できる(あいまいな)組み込み機能があるかどうかです。
c++ - 静的ポリモーフィズムの戦略と CRTP の違いは何ですか?
コンパイル時に選択される、複数の可能な実装を持つインターフェイスが必要です。CRTP がこれを実装するためのイディオムであることがわかりました。何故ですか?代替手段は戦略パターンですが、この手法についてはどこにも言及されていません。
BrokenInterface
残念ながら、実際に使用しようとしない限り、どちらの場合もコンパイラにキャッチされません。戦略バリアントは、醜いものを回避し、static_cast
継承の代わりに構成を使用するため、私には優れているようです。CRTP で許可されていて、ストラテジーでは許可されていないものは他にありますか? 代わりに CRTP が主に使用されるのはなぜですか?
c++ - テンプレートを介した静的ディスパッチで前方宣言が必要ないのはなぜですか?
私は静的ポリモーフィズムで少し遊んでいます。初期引数の型に応じて「正しい」特殊な関数を内部的に呼び出す関数を呼び出しています (基本的にタグ付けを行っています)。コードは次のとおりです。
そのためf(T)
、パラメータで呼び出されるmy_type1
かmy_type2
、内部的tag_type
に適切なタグtag1
/で typedef する必要がありますtag2
。この internal に応じてtag_type
、「正しい」ラッパーが呼び出され、この決定はもちろんコンパイル時に行われます。このコードが機能している理由が本当にわかりませんか? を前方宣言する必要がないのはなぜf_helper
ですか? main
私は最初に の前(および後)にラッパーを定義しましたが、わかりませんがf
、これは理にかなっています。タイプなので、インスタンス化の時点でコンパイラーは.f(type1);
main()
T
f_wrapper
しかしご覧のとおり、ラッパーを AFTER として宣言してもmain()
、コードは機能します。なぜこうなった?コードが機能する理由を尋ねる質問は少し奇妙だと思います:)
編集
コードは、gcc5 および gcc HEAD 6.0.0 でも引き続きコンパイルされます。
c++ - テンプレート コンパイラの制限?
このエラーを説明するのは難しいですが、静的ポリモーフィズムを少し極端に使用したことが原因です。
次のコードを参照してください。コードで、テンプレート化されたクラスからテンプレート化されたクラスを派生させ、複数のテンプレート パラメーターを指定してテンプレート化された関数を使用すると、あまり役に立たないコンパイル エラーが発生します。
奇妙なことに、派生クラス自体がテンプレート化されていない場合、またはテンプレート化された関数にテンプレート引数が 1 つしかない場合、この問題は発生しません。私は完全に困惑しているので、どんな助けでも大歓迎です。Fedora 7 で gcc 4.7.2 を使用しています。