問題タブ [crtp]
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++ - ジャストインタイム導出
あまり一般的ではない C++ のイディオムがありますが、これは私が過去に何度か使用してうまくいきました。それを説明するために一般的に使用されている名前があるかどうかを思い出せないようです。
mixins、CRTP、およびtype-erasureに多少関連していますが、特にこれらのいずれかではありません。
クラスに実装を追加したいが、それをクラスまたはその派生元のクラスに配置したくない場合に、問題が発生します。この理由の 1 つは、クラスが継承階層の一部であり、実装が 1 回だけ発生する可能性があるためです。
とりあえず、階層に具体的な非リーフ クラスを含める必要があるかどうか、場合によっては仮想継承がオプションになるかどうかなどの問題はさておき、次から派生するテンプレート クラスで実装を提供する 1 つのソリューションを知っています。そのテンプレート パラメータ。これにより、インスタンスを作成するときにテンプレートを使用できますが、そのオブジェクトのベースの 1 つへのポインターまたは参照によってのみオブジェクトを使用できます (大まかな意味での型消去の出番です)。
例として、侵入的な参照カウントがある場合があります。すべてのクラスは ref カウント インターフェイスから派生しますが、ref カウント自体と ref カウント メソッドの実装を 1 回だけ表示する必要があるため、それらを派生テンプレートに入れます。それを呼び出しましょうImplementsRC<T>
。これで、次のようにインスタンスを作成できます。
複数のテンプレート化されたオーバーロードなどで形成されたコンストラクターの転送などについて詳しく説明しています。
それで、イディオムが何であるかを明確にしたことを願っています。私の質問に戻ります - このイディオムに受け入れられている、または少なくとも一般的に使用されている名前はありますか?
c++ - 派生クラス コンストラクタの問題への依存
私はレガシーフレームワークに取り組んでいます。「A」が基本クラスで「B」が派生クラスだとしましょう。どちらのクラスも、いくつかの重要なフレームワークの初期化を行います。FWIW、それはACEライブラリを多用しています。
私には次のような状況があります。「B」のインスタンスが作成されます。しかし、「A」の ctor は、「B」からのみ実行できるいくつかの初期化に依存しています。
'B' がインスタンス化されると、'A' の ctor が 'B' の ctor の前に呼び出されます。このvirtual
メカニズムは ctors からは機能しません。使用static functions
は除外されています ( static-initialization-order- fiasco のため)。
次のようにCRTPパターンを使用することを検討しました:-
しかし、イニシャライザ リストで初期化されたクラス メンバは、まだ実行されていないため、未定義の値を持ちます (上記の場合は fe 'a')。私の場合、そのようなフレームワークベースの初期化変数が多数あります。
この状況を処理するためのよく知られたパターンはありますか?
前もって感謝します、
更新:
dribeas から提供されたアイデアに基づいて、この問題に対する一時的な解決策を思いつきました (本格的なリファクタリングは、今のところ私のタイムラインには合いません)。次のコードは同じことを示します:-
同じことの詳細については、clc++.m のこのリンクを参照してください。Konstantin Oznobikhin によって提供された優れた一般的な解決策があります。
c++ - CRTP での C++ コンパイラ エラー
次のクラス階層があります。
Comeu と Intel C++ v11 はすべて問題ないと主張していますが、GCC (4.4.1) と VC++ 2008 は不平を言っているようです ( http://codepad.org/KQPDsqSp )。
コードはそのままで適切に形成されていると思いますが、間違っている可能性があります。SO C++ コミュニティの誰かがこの問題について何らかの洞察を提供してくれることを願っています。
注: class_b の using ディレクティブの前に「public」を追加すると、gcc と VS の両方の問題が解決されます。using ディレクティブが適用されるクラスのアクセサー セクションは、基本クラスの派生モード (パブリック、プライベート) をオーバーライドする必要がありますか?
要するにこれ
- コンパイラ エラー - その場合、コンパイラは GCC、VS、Comeu、Intel のいずれか
- 上記のコードは整形式ですか?
- using ディレクティブが呼び出されるアクセサ セクションは、ベースの派生モードをオーバーライドしますか?
c++ - CRTPによる継承
私はこの3つのクラスを持っています。
そして、私はこれを行います:
そして、「Cで」と表示されます。
私がこれを行うと、
再び「In C」と表示されます
何が起こっている?
g++ - ミックスイン、可変個引数テンプレート、およびC++のCRTP
シナリオは次のとおりです。可変数のミックスインを持つことができるホストクラスが必要です(可変個引数テンプレートではそれほど難しくありません。たとえば、http: //citeseerx.ist.psu.edu/viewdoc/summary?doiを参照してください)。 = 10.1.1.103.144)。ただし、(CRTPイディオムを使用して)パブリックタイプを参照できるように、ミックスインをホストクラスによってパラメーター化することも必要です。この2つを混在させようとすると、問題が発生します。正しい構文は私にはわかりません。たとえば、次のコードはg++4.4.1でコンパイルできません。
エラーあり:
可変個引数テンプレートとCRTPの混合に成功した経験はありますか?
c++ - ポリシーベースの設計と C++ での CRTP の混合
ポリシー ベースのホスト クラス (つまり、テンプレート クラスから継承するクラス) を作成しようとしていますが、ポリシー クラスもホスト クラスによってテンプレート化されているため、その型にアクセスできます。これが役立つ 1 つの例は、ポリモーフィックな clone() メソッドでホスト クラスを拡張するポリシー (実際には mixin のように使用される) です。これが私がやろうとしていることの最小限の例です:
残念ながら、これはコンパイルに失敗します。循環型依存関係のように思えます。
誰かが明らかな間違いを見つけた場合、またはポリシーに CRTP をうまく混在させることができた場合は、助けていただければ幸いです。
java - 循環ジェネリック参照の作成
ピアツーピアネットワークで分散計算を行うためのアプリケーションを作成しています。ネットワークを定義する際に、P2PNetworkとP2PClientの2つのクラスがあります。これらを一般的なものにしたいので、次の定義があります。
P2PClientがsetNetwork(T network)のメソッドを定義します。このコードで説明したいのは次のとおりです。
- P2PNetworkは、特定のタイプのクライアントで構成されています
- P2PClientは、クライアントがこのクライアントと同じタイプで構成されているネットワークにのみ属することができます(循環参照)
これは私には正しいようですが、次のような一般的でないバージョンを作成しようとすると
およびその他のバリアントコンパイラから多数のエラーを受け取ります。だから私の質問は次のとおりです:
- 一般的な循環参照も可能ですか(明示的に禁止されているものを見たことがありません)?
- 上記の一般的な定義は、そのような循環関係の正しい定義ですか?
- それが有効である場合、それはそのような関係を説明するための「正しい」方法ですか(つまり、スタイル的に好ましい別の有効な定義がありますか)?
- 適切なジェネリック定義が与えられた場合、クライアントとサーバーの非ジェネリックインスタンスを適切に定義するにはどうすればよいですか?
c++ - 2層以上の継承を持つ不思議な繰り返しテンプレートを作成するにはどうすればよいですか?
不思議なことに繰り返し発生するテンプレートパターンで読んだすべての資料は、継承の1つの層、つまりBase
とのように見えDerived : Base<Derived>
ます。さらに一歩進めたい場合はどうすればよいですか?
このコードを書き直して、エラーなしでコンパイルして表示するにはどうすればよいですか?
C
B
c.get()。print()およびb.get()。print()を使用しますか?
動機:私が3つのクラスを持っていると仮定します、
各クラスは、コンストラクターで6つほどのパラメーターを取ります。これらのパラメーターの多くはオプションであり、適切なデフォルト値があります。オプションのパラメータの面倒を避けるための最善の解決策は、名前付きパラメータイディオムを使用することです。
このイディオムの基本的な問題は、パラメータークラスの関数が呼び出されたオブジェクトを返さなければならないことですが、一部のパラメーターはGuiElementに、一部はWindowに、一部はAlertBoxに渡されます。これを書く方法が必要です:
ただし、たとえば、GuiElementParameter(int)はWindowParameter(int)関数を持たないGuiElementOptions&を返す可能性があるため、これはおそらく失敗します。
これは以前に尋ねられたものであり、解決策は不思議なことに繰り返されるテンプレートパターンのフレーバーのようです。私が使用する特定のフレーバーはここにあります。
ただし、新しいGui要素を作成するたびに記述するコードはたくさんあります。私はそれを単純化する方法を探していました。複雑さの主な原因は、CRTPを使用してNamed-Parameter-Idiomの問題を解決しているという事実ですが、2つではなく3つのレイヤー(GuiElement、Window、AlertBox)があり、現在の回避策では、クラスの数が4倍になっています。 。(!)たとえば、Window、WindowOptions、WindowBuilderT、およびWindowBuilder。
それは私の質問に私をもたらします。そこでは、GuiElement、Window、Alertboxなどの継承の長いチェーンでCRTPを使用するためのよりエレガントな方法を本質的に探しています。
c++ - C ++ CRTP(テンプレートパターン)の質問
次のコードはコンパイルされT::rank
ません。問題は、親テンプレートでアクセスできない(私は思う)か、初期化されていないことにあります。
問題が何であるかを正確に教えてもらえますか?ランクを明示的に渡すことが唯一の方法ですか?または、テンソルクラスを直接クエリする方法はありますか?
ありがとうございました
私は回避策を知っていますが、独学のためのテンプレートインスタンス化の仕組みに興味があります
c++ - CRTP のテンプレート化された派生クラス (Curiously Recurring Template Pattern)
おそらく派生クラス自体がテンプレートであるため、g++ 4.2.1 でコンパイルされない CRTP を使用していますか? なぜこれが機能しないのか、それともうまくいくのか、それを機能させる方法を知っている人はいますか? サンプル コードとコンパイル エラーは次のとおりです。