問題タブ [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.

0 投票する
1 に答える
2397 参照

c++ - CRTP ベースのクラスをベクトルに格納する際に問題が発生する

これができるかどうかはわかりませんが、テンプレートを掘り下げているだけなので、私の理解は少し間違っているかもしれません。

私は兵士の小隊を持っています。小隊はフォーメーションから継承してフォーメーションのプロパティを取得しますが、考えられる限り多くのフォーメーションを持つことができるため、CRTP を使用してフォーメーションを作成することにしました。小隊を格納する小隊のベクトルまたは配列。しかし、もちろん、小隊を作成すると、「タイプは無関係です」というベクトルに格納されません

これを回避する方法はありますか?似たような「ベニア」について読みましたが、それらは配列で動作しますが、動作させることができません。おそらく何かが足りないのでしょう。

ここにいくつかのコードがあります:(フォーマットについて申し訳ありません。コードは私の投稿にありますが、何らかの理由で表示されません)

次に、小隊クラスでこれらのフォーメーションを使用して派生させ、小隊が関連する SetupFormation() 関数を取得できるようにします。

この時点まで、すべてがうまく機能し、期待どおりです。

現在、将軍は複数の小隊を持つことができるため、小隊を保管する必要があります。

typedef Platoon< IFormation<> > TPlatoon; テンプレート パラメーターを指定する必要があるため失敗しますが、これを指定すると、同じテンプレート パラメーターで作成された小隊しか保存できません。

だから私は FormationBase を作成しました

それから IFormation をパブリックに継承させ、typedef を次のように変更しました。

しかし、まだ愛はありません。

今私の検索では、これが可能である、または不可能であるという情報は見つかりませんでした。

0 投票する
1 に答える
423 参照

c++ - マルチファイルプログラムで「奇妙な繰り返しテンプレートパターン」を使用する

私はかなり初心者 (C++) のプログラマーで、特定のクラスに属するオブジェクトの数を保持するための CRTP を発見しました。

私は次のように実装しました:

これはうまくいくようです。ただし、これを宣言した別のヘッダー ファイルで継承するのは好きではないようです。

継承なしですべてがうまくコンパイルされるので、テンプレートの宣言と定義を確認できないと確信しています。私が間違っている可能性がある場所とそれについて何ができるかについて、誰か提案がありますか? インフェクタ定義の前に extern を使用して、コンパイラに Counter テンプレートなどについて知らせる必要がありますか?

乾杯、

カイル

0 投票する
1 に答える
605 参照

c++ - CRTPとテンプレート式

テンプレート式とCuriouslyRecursiveTemplate Pattern(CRTP)を使用する複雑なライブラリでは、オーバーロードされた演算子を基本クラスに特化する必要がありますが、派生クラスを含む操作では基本クラスの特殊化が見つかりません。

すなわち:

  • BaseA <T> + BaseA <T>に対して演算子が定義されている場合、コードDerivedA <T> +DerivedA<T>は演算子に問題がないことを検出します。
  • BaseB <T> + BaseB <T>に対して演算子が定義されている場合、コードDerivedB <T> +DerivedB<T>は演算子に問題がないことを検出します。
  • ただし、BaseB <BaseA <T>> + BaseB <BaseA <T>>に対して演算子が定義されている場合、DerivedB <DerivedA <T>> + DerivedB<DerivedA<T>>はその演算子を検出しません。

特殊なネストされたケースの演算子が確実に見つかるようにするにはどうすればよいですか?

このように問題を言い換えることができます:

クラスがある場合(CRTPを使用)

そして私にはオペレーターがいます

これは、関数DerivedB <DerivedA <double >> + DerivedB <DerivedA<double>>を解くために喜んで使用されます。

しかし、代わりに同じ操作のためのより専門的なオペレーターがいる場合

この演算子は同じ関数で見つかりません

この関数を解くための専門のオペレーターを確実に見つけるにはどうすればよいですか?

問題を再現するために、1行のBA1+BA2のみの模倣コードを添付しました。g++ではコンパイルされません。

完全なコード例:

0 投票する
4 に答える
1698 参照

c++ - 仮想デストラクタを使用すると、非仮想関数が v-table ルックアップを行うようになりますか?

トピックが求めるものだけです。また、CRTP の通常の例で dtor が言及されていない理由も知りたいですvirtual

編集:みんな、CRTPの問題についても投稿してください、ありがとう。

0 投票する
3 に答える
746 参照

delphi - Delphi ジェネリック クラスは、そのクラス引数から派生できますか?

私は、ジェネリックで継承可能な TSingleton クラスを定義しようとしています。これが私が進行中のものです:

目標は、継承ツリーにシングルトン パターンを「挿入」できるようにすることでした。したがって、次のようなものを宣言する代わりに:

そこにシングルトンパターンを実装する必要がある場合、次のように宣言します。

残念ながら、これはうまくいきません。次のエラーが表示されます (D2010 の場合):

今、私は疑問に思っていましたが、これは Delphi XE で機能しますか? D2010でこれを機能させるために使用できる「クリーンハック」はありますか? これがうまくいかない根本的な理由はありますか?

0 投票する
3 に答える
2983 参照

c++ - 派生クラスをテンプレート パラメーターとして使用するのは何ですか?

このパターンの目的は何ですか? それはなんと呼ばれていますか?初めて見たときはとても奇妙に見えましたが、今では何度も見ています。

0 投票する
6 に答える
55758 参照

c++ - 奇妙に繰り返されるテンプレート パターン (CRTP) とは何ですか?

本を参照せずに、誰かCRTPがコード例で良い説明を提供できますか?

0 投票する
3 に答える
611 参照

c++ - CRTPはdecltypeで失敗します

私にはかなり単純なようです。しかし、MSVCはコンパイルに失敗します。

コンパイラーは関数の呼び出しを喜んで受け入れますが。以下のサンプルは正常にコンパイルされます。

テンプレート引数から任意の型を使用しようとすると、同じ問題が発生します。

一方、クラスBは「何か」と呼ばれるタイプを明確に定義しています。コンパイラーは、T型、T&型、またはT *型のオブジェクトで関数を呼び出すことができますが、Tからどの型にもアクセスできないようです。

0 投票する
5 に答える
1768 参照

c++ - CRTPの使用中にエラーを回避するにはどうすればよいですか?

CRTPを使用して、次のようなコードを書くことがあります。

そして、デバッガーでコードをトレースし、Barのメンバーがで使用されていないことを確認するまで、何が問題になっているのかを理解するのは非常に困難Baseです。

コンパイル時にこのエラーを明らかにするにはどうすればよいですか?

(私はMSVC2010を使用しているので、いくつかのC ++ 0x機能とMSVC言語拡張機能を使用できます)

0 投票する
2 に答える
460 参照

c++ - これは静的ポリモーフィズムのCRTP使用法ですが、派生関数は実装されていません。gccとビジュアルスタジオの両方でコンパイルします。なんで?

フォローアップの質問:このタイプを安全にするにはどうすればよいですか?つまり、誰かがmethod2の実装を忘れた場合、コンパイラにそれをキャッチしてもらいたいのです。実行時にこれが爆発するのは望ましくありません。