問題タブ [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++ - 基本クラスによるC++テンプレートの特殊化
_base *から派生していないクラスでfooのコンストラクターを呼び出すときに、コンパイラーを叫ばせることができるようにしたいと思います。現在のコードでは、foo<_base*>自体のみが許可されています。簡単な解決策はありますか?
メインコード:
c++ - C++ テンプレートの部分的な特殊化 - 1 つのメンバー関数のみを特殊化する
別のテンプレートの問題にぶつかりました:
問題: オブジェクトがポインターである場合に備えて、コンテナー クラス (foo) を部分的に特殊化したいのですが、delete メソッドだけを特殊化したいのです。次のようになります。
ライブラリコード
ユーザーコード
これにより、myptrs には addSome というメソッドがないことがコンパイラに通知されます。なんで ?
ありがとう。
解決
ここでのトニーの答えに基づいて、完全にコンパイル可能なものライブラリ
ユーザー
c++ - stlスタイルのコンテナタイプに特化した関数
タイプがある場合T
、コンパイル時にそれを検査して、そのSTLスタイルのコンテナー(任意の値タイプの場合)かどうかを確認するための便利な方法は何ですか?
(仮定:ポインター、参照などはすでに削除されています)
開始コード:
これで問題なく動作しますが、コンテナを一般化したい場合(つまり、(3)、(4)、...を明示的に定義しない場合)はどうなりますか?
SFINAEとタイプリストを利用すると、コードがいくらか削減されますが、より良い方法はありますか?
それとも、概念に基づいて専門化するためのイディオムはありますか?
または、どういうわけかSFINAEを利用して、目的の専門分野のみを選択的に有効にすることはできますか?
補足として、私はイテレータを使用できません-T
パラメータとしてsを受け取る関数に基づいて専門化しようとしています。
MSaltersの答えによると:
(可変引数リストは、f
あいまいさのエラーを解決するための最初の最も好ましくないバージョンを作成するために必要です)
c++ - (非メンバー)関数に部分的なテンプレートの特殊化を使用できますか?
(非メンバー)関数で部分的なテンプレートの特殊化を使用しようとしていますが、構文につまずきます。StackOverflowで他の部分的なテンプレートの特殊化の質問を検索しましたが、それらはクラスまたはメンバー関数テンプレートの部分的な特殊化を扱っています。
出発点として、私は次のことを行っています。
ConvertPixelを完全に特殊化して、RGBAからグレースケールへの変換関数を次のように作成できます。
赤、緑、青を提供するピクセルタイプはもっとあると思いますが、おそらく異なる形式なので、私が本当にやりたいのは、さまざまなsを指定Grayscale
しOutType
、それでも許可することによる部分的な特殊化です。InType
私はこのようなさまざまなアプローチを試しました:
しかし、(Microsoft VS 2008 C ++)コンパイラはそれを拒否します。
私が試みていることは可能ですか?もしそうなら、正しい構文は何ですか?
c++ - 親を特殊化せずにメンバー テンプレートを特殊化する
別のテンプレート内にネストされたクラス テンプレートがあります。部分的に特殊化するのは簡単ですtemplate< … >
。親の中で別のブロックを宣言するだけです。
ただし、すべてのローカル テンプレート引数を指定する別の部分的な特殊化が必要です。これにより、明示的な特殊化になります。明示的な特殊化は、何らかの理由で、名前空間のスコープにある必要があります。親クラスの外で宣言するには、親を指定する必要があります。これには、空でないテンプレート引数リストが必要です。これは、部分的な特殊化を意味します。私が行っているのは部分的な特殊化であり、任意の外側のスコープで動作するはずです。しかし、GCC と Comeau はどちらも、部分特殊化の仮引数を使用して、親の指定でテンプレート パラメーターを識別できません。
(動作しないコードはすべて残しました。意味を理解するために適切にコメントしてください。)
c++ - 無料関数の部分的なテンプレートの特殊化-ベストプラクティス
ほとんどのC++プログラマーが知っておくべきことですが、フリー関数の部分的なテンプレートの特殊化は許可されていません。たとえば、以下は不正なC++です。
ただし、クラス/構造体の部分的なテンプレートの特殊化は許可されており、無料の関数の部分的なテンプレートの特殊化の機能を模倣するために利用できます。たとえば、最後の例の目標は、次を使用して達成できます。
それはよりかさばり、簡潔ではありませんが、それは仕事を成し遂げます-そしてユーザーmul
に関する限り、彼らは望ましい部分的な専門化を取得します。
私の質問は次のとおりです。テンプレート化された無料の関数(他の人が使用することを目的としています)を作成する場合、実装をクラスの静的メソッド関数に自動的に委任して、ライブラリのユーザーが部分的な特殊化を自由に実装できるようにする必要があります。テンプレート化された関数を通常の方法で記述し、人々がそれらを専門化できないという事実を受け入れますか?
c++ - クラステンプレートコンストラクターの専門化
テンプレートの特殊化をいじっていて、使用されているポリシーに基づいてコンストラクターを特殊化しようとすると問題が発生しました。これが私が動かそうとしているコードです。
... \ main.cpp(29):エラーC3860:クラステンプレート名に続くテンプレート引数リストは、テンプレートパラメータリストで使用される順序でパラメータをリストする必要があります... \ main.cpp(29):エラーC2976:'Die':テンプレート引数が少なすぎます...\main.cpp(31):エラーC3860:クラステンプレート名に続くテンプレート引数リストは、テンプレートパラメータリストで使用されている順序でパラメータをリストする必要があります
これらは、Microsoft Visual Studio 2010で発生するエラーです。専門分野の正しい構文がわからないか、この方法ではできないのではないかと考えています。
c++ - 明示的な特性を持たない整数テンプレート パラメーターの符号付き/符号なしバリアントを取得する
テンプレート パラメータが常に整数型になるテンプレート クラスを定義しようとしています。クラスには 2 つのメンバーが含まれます。1 つは typeT
で、もう 1 つはタイプの符号なしバリアント (T
つまり、 if T == int
、 then )T_Unsigned == unsigned int
です。私の最初の本能はこれを行うことでした:
しかし、うまくいきません。次に、次のように、部分的なテンプレートの特殊化を使用することを考えました。
すべての整数型を部分的に特化UnsignedType
している限り、これは機能します。追加のコピー アンド ペースト作業 (マクロの賢明な使用を断念) が少しありますが、実用的です。
ただし、私は今興味があります-型ごとに Traits クラスを手動で定義することなく、整数型の符号付きを決定したり、型の符号なしバリアントを使用したりする別の方法はありますか? それとも、これが唯一の方法ですか?
c++ - 部分的なテンプレートの特殊化をテンプレート化する方法は?
この質問にどのタイトルを付けるかさえわかりません。うまくいけば、コードは私がやろうとしていることを示しています:
Alpha<A>
Aが任意のタイプの場合の特殊化を記述したいのですBravo<B>
が、コンパイラーは
クラステンプレートを囲む'>'トークンの前の無効な明示的な特殊化は明示的に特殊化されていません
(を参照して// Line A
ください。)私がやりたいことをするための正しい構文は何ですか?
c++ - VS2005 で参照テンプレート パラメーターを使用した部分的な特殊化がコンパイルに失敗する
次のようなコードがあります。
これは GCC では正常にコンパイルされますが、VS2005 では次のようになります。
ただし、 (参照ではなくポインターで渡す) に変更const Foo<T>& I
し、次のように定義すると:const Foo<T>* I
I
FloatFooBar
GCC と VS2005 の両方が満足しています。
どうしたの?これは、VS2005 が GCC とは異なる方法で処理しているある種の微妙なテンプレート置換エラーですか、それともコンパイラのバグですか?
(最も奇妙なことに、今朝早く VS2005 で上記のコードが動作していると思っていました。しかし、それは朝のコーヒーを飲む前のことでした。今では、ある種のカフェイン渇望によって引き起こされたせん妄状態に陥っていなかったという確信はありません.. .)