問題タブ [partial-specialization]
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++ - 部分的なテンプレートの特殊化: 特殊化されたテンプレート パラメーターのプロパティの照合
の通常のテンプレートになるが、特殊化になるA
ような部分的な特殊化を定義する方法はありますか?A<C, B<P1> >
A
A<C, B<P2> >
Marcelo に応じて編集: より具体的には、特殊化は B だけでなく、特定のプロパティを示す任意の型で選択する必要があります。たとえば、最初の引数が P2 であるテンプレートです。
目標は、 を使用して のようなものを記述できるようにするY
ための優れたインターフェイスを提供することです。A
A<C, Y<P2,Q> >
テンプレート パラメータをテンプレート テンプレート パラメータに置き換えるのはY
いいことですが、それに基づいて部分的に特殊化する方法はありP
ますか?
意図は次のようなものを書くことです:
In silico に応じて編集: テンプレート テンプレート パラメーターを作成するのはいいことだと言いましたが、実際には、論理的にリンクされたプロパティをグループ化するために使用することですが、1 つに基づいて専門Y
化するという、私がやりたかったことの目的を無効にします。それらのサブプロパティの。Y
A
特殊化に特性を追加してからtemplate <> class B<P2>
SFINAE を使用する方法はありA
ますか? 意図は次のようなものを書くことです:
c++ - クラス テンプレートの部分的な特殊化に関する問題
私は、部分的なテンプレートの特殊化を必要とする関数を実装しようとしており、静的構造体の手法に戻ってきましたが、多くの問題が発生しています。
最初: 構造体は別のクラス (Push をメンバー func として提供するクラス) 内にネストされていますが、他のネストされたクラスはすべてアクセスできますが、テンプレート パラメーター (StackSize) にアクセスできません。私はそれを回避しましたが、通常のクラスのように StackSize にアクセスできればすっきりします。
2 番目: コンパイラは、T を使用していない、または T を推測できないと文句を言います。
3 番目: コンパイラは、現在のスコープ (クラス スコープ) でテンプレートを特殊化できないと文句を言います。
何が問題なのかわかりません。誤って不適切な構文を呼び出したことがありますか?
c++ - C++: テンプレートの部分的な特殊化
部分的なテンプレートの特殊化を取得していません。私のクラスは次のようになります。
エラー gcc 出力は次のとおりです。
いくつかの解決策を試しましたが、どれもうまくいきませんでした。誰か私にヒントがありますか?
c++ - CPP テンプレート メンバー関数の特殊化
次のように、メンバー関数 moment() のみ (穴クラスではない) を特殊化しようとしています。
実際の特殊化は、追加の abstractWaveletSpecialization 構造体で行われます。
問題は、特殊化された abstractWaveletSpecialization 構造体で momentImpl() を呼び出せないことです。
しかし、特殊化されていない abstractWaveletSpecialization 構造体での momentImpl の呼び出しについて、コンパイラは文句を言いません。
私のアプローチは C++ で禁止されていますか? または、これを機能させる方法はありますか?
c++ - mplを使用した既存のメタ関数の部分的な特殊化
今日は全員ではないかもしれませんが、これをどのように機能させるのか疑問に思っています。Boostライブラリからrange_mutable_iteratorとrange_const_iteratorを部分的に特殊化したいのですが、明示的に言及するのを避けたい特定のタイプに対してのみ、enable_ifテスト基準に合格した場合にのみ部分的な特殊化を選択させます。
現在MSVC2008を使用していますが、次のエラーが発生します
ArrayType
:: template parameter not used or deducible in partial specialization
on type
STLFiltを使用して、ArrayTypeの代わりにTへの奇妙な参照に注意してください。STLFiltは、T == ArrayType ..?を理解できないと言っていると思います。これが私が今持っているものです:
range_begin / range_endを機能させることは現在のところ問題ではありません。目標は、次のようなラインワークを実現することです。
編集:この回答から編集した別のアプローチを試した後、この場合は部分的な特殊化は不可能であると受け入れるようになったので、完全な特殊化と大量の使用を伴う別のアプローチを使用しましたBoost.Preprocessor。
c++ - テンプレートのC++部分特殊化でエラーが発生しました
私はPC-Lint(静的コード分析のための優れたツール-http : //www.gimpel.com/を参照)を使用しています。次のコードのチャンクについては、次のとおりです。
PC-lintは私に警告を出します:
コードは問題なく、エラーはlint側にあると思いますが、Lintツールは本当に素晴らしいツールであり、私が何かを知らないよりも可能性が高いと思います。それで、このコードは大丈夫ですか?
c++ - std :: tuple_elementはユニバーサルテンプレート引数レトリバーを兼ねることができますか?
この質問は私に考えさせました。引数のパブリックを定義できない場合は、クラステンプレートの特殊化から実際の引数を取得すると便利な場合がtypedef
あります。C ++ 03では、これは悪いテンプレートデザイン、または反対のデザイン意図のいずれかの兆候であり、特に一般的ではありません。ただし、可変個引数テンプレートを使用するとtypedefのカバレッジが不可能になるため、追加の作業を行わずに問題を解決するためのツールがあれば便利です。
C ++ 0xはtypedef
、1つの特定の可変個引数テンプレートの問題を解決しtuple
ます。
しかしtuple_element
、結婚していませんtuple
; とでも機能しpair
ますarray
。その宣言は言及していませんtuple
。
tuple
部分的な特殊化によって関連付けられています:
しかし、そうである必要はありません。tuple
テンプレートテンプレートパラメータは、タイプに対してのみパラメータ化された他のテンプレートと一致する可能性があります。
これにより、
それでも、追加の専門化を許可しますarray
array
の2番目の引数は型ではなく、であるため、競合は発生しませんsize_t
。
残念ながら、ユーザーはtuple_element
自分のタイプに合わせてインターフェースを特殊化することができます。ユーザーの前提条件とその保証は、C++0x§17.6.3.2.1/1によって与えられます。
プログラムは、宣言がユーザー定義型に依存し、特殊化が元のテンプレートの標準ライブラリ要件を満たし、明示的に禁止されていない場合にのみ、任意の標準ライブラリテンプレートのテンプレート特殊化を名前空間stdに追加できます。
したがって、一般的な特殊化が特殊化と競合してはならないだけでなく、ユーザー定義型を指定する特殊化array
とも競合してはなりません。つまり、ユーザーが特殊化を宣言した場合、一般引数ゲッターの存在は、それが選択されるかどうかに影響を与えることはできません。
インスタンス化であいまいさが生じた場合(つまり、2つの部分的な特殊化が引数リストに一致する場合)、選択肢が比較されて、どちらが最も特殊化されているか、つまり最も一般化されていないかが判別されます。選択肢をAとBと呼びます。これは、AがBの仕事をすることはできるが、BがAの仕事をすることができない場合、Bはより専門的であることを意味します。Aはジェネラリストです。Bが選択されます。インスタンス化を引き起こす実際の引数は、両方の候補に一致することがすでにわかっているため、考慮されません。
一般的なテンプレートを他のすべてに延期したいので、良好な状態です。
一般性は、Aの部分特殊化パラメーターを一意のダミー型に置き換え、Bもそのような特殊化を実装できるかどうかをチェックすることによってチェックされます。役割を逆にして繰り返します。反対の結果が得られた場合、1人の候補者がより専門的であることがわかります。
ユーザーのスペシャライゼーションにユーザー定義型が存在すると、その優先順位が保証されます。これは、引数ゲッターに対応する一意のダミー型が存在する必要があるためです。これは、それに一致しません。
たとえば、これは非常に一般的なユーザー宣言の専門分野です。これはtuple_element
、特定のを含むタイプパラメータ化されたテンプレートを定義しますuser_type
。
シーケンス..., user_type, ...
は一般的なケースで処理できますが、ユーザーのケースでは、が含まれないため、完全に人工的な一意のタイプで構成されるシーケンスを処理できませんuser_type
。
いずれかのユーザー専門分野が候補である場合、それは優れた専門分野になります。
(標準では、疑似コードでの個別の部分特殊化が指定されていますがtuple
、as-ifルールでは省略できます。とにかく、実装されている場合は、ユーザーを保護するのと同じ優先順位ルールでカバーされます。)
私は半順序規則に多くの進出をしていません。この分析は正しいですか?実装が一般的なテンプレートインデクサーを公開しても大丈夫ですstd::tuple_element
か?
c++ - タイプ定義の後に複数の部分的な特殊化と完全な特殊化が必要<>
の1つまたは2つの引数をデリゲートと呼ぶことができるC++の「イベント」クラスを使用しています。
最近、引数を必要としないデリゲートのサポートを追加しましたが、テンプレート引数を使用しないようにクラスを特殊化する場合でも、クラス定義の後に<>を追加する必要があります。
1つまたは2つの引数を使用した使用例:
そしてここに引数なしの例:
角かっこで動作するので、角かっこが必要な理由がわかりません。クラス特殊化コードは次のとおりです。
c++ - 関数テンプレートの部分的な特殊化
C++ 11 で関数テンプレートを部分的に特殊化できるかどうかを知っている人はいますか?
c++ - パラメータとしてテンプレートを持つクラスのc++メンバー関数の特殊化
別のテンプレートTRAITSをパラメーターとして受け入れるテンプレートクラスArrayに取り組んでいます。
Traits :: Structに基づいてArrayのoperator[]を特殊化したかったのですが、構文に固執しています。それが可能かどうかはわかりません。
コンパイラ(g ++ 4.4)は文句を言います:
編集。
解決策はaaaによる提案に基づいており、次のようになります。