問題タブ [explicit-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 ++テンプレートクラスの1つのメソッドのみに明示的な特殊化を提供するにはどうすればよいですか?
次のようなテンプレートクラスがあります。
私が欲しいのはA
、のデフォルトB
と「その他のもの」を保持しながらのみ、明示的な特殊化を提供することです。
私がこれまでに試したことは
私が試みた他のすべてのバリアントは、解析エラーで失敗します。
私がしたこと:
元々の問題は、明示的な特殊化がヘッダーファイルに含まれていたため、複数のオブジェクトファイルにダンプされ、リンクが混乱していたことでした(リンカーは、シンボルのすべてのインスタンスが同じであることに気付かないのはなぜですか?)
解決策は、明示的な特殊化をヘッダーファイルからコードファイルに移動することです。ただし、ヘッダーファイルの他のユーザーをデフォルトバージョンにインスタンス化しないようにするには、プロトタイプをヘッダーに戻す必要がありました。次に、GCCに明示的な特殊化を実際に生成させるために、正しいタイプのダミー変数をコードファイルに配置する必要がありました。
c++ - 派生型に基づくクラスの明示的な特殊化の選択
こんにちは、明示的な特殊化を持つテンプレート化されたクラスの正しいバージョンを選択する際に問題があります。特殊化に使用されるクラスの派生クラスを使用して、特殊化を選択したいと考えています。シナリオは次のとおりです。
私がコメントで言っているように、B は A から派生したものですが、代わりに 10 が出力されるため、20 が出力されることを確認したいと思います。派生クラスごとに特殊化を記述することに頼らずに、特殊化を呼び出すにはどうすればよいですか (私の実際のシナリオには多くの派生型があります)。
c++ - 明示的なインスタンス化を使用してクラステンプレートを設定する方法
この質問をしてテンプレートについてたくさん読んだ後、クラステンプレートの次の設定が理にかなっているのかどうか疑問に思います。
、などのResourceManager
いくつかの特定のリソースのみをロードするというクラステンプレートがあります。明らかに、ResourceManager.hでクラステンプレートを定義します。ただし、明示的なインスタンス化はわずかしかないため、次のようなことを行うのが適切でしょうか...ResourceManager<sf::Image>
ResourceManager<sf::Music>
要するに、私はテンプレートクラスとそのメソッドの宣言と定義を処理するための最もクリーンな方法を見つけようとしています。その一部は明示的な特殊化である可能性があります。これは特殊なケースであり、使用される明示的なインスタンス化はごくわずかであることがわかっています。
c++ - クラステンプレート引数に基づいてメンバー関数を特殊化する方法
質問の内容。さらに、これをインラインで行うことは可能ですか?
これはアイデアを与えるための小さな例です...
c++ - 明示的なインスタンス化
これは、この記事 (5 ページ)によって動機付けられました。
呼び出しは'f(x, s)'
整形式ですか? 関数テンプレート'f'
は明示的にインスタンス化されるため、標準の変換が適用され、明示的な特殊化への呼び出しに一致する'short s'
ように変換されると想定しました。しかし、これは形式が悪いように見えますか?'int'
'f<int>'
この文脈で適用される規則について述べている規格の部分はどれですか?
c++ - テンプレート関数を上書きしない通常の関数
外部ライブラリを使用する必要がありますが、std :: stringで呼び出された場合、次のテンプレート関数とその明示的な特殊化から「複数定義エラー」が発生します。
2番目の関数をに変更しても
問題は同じです。
[1]によると、少なくともテンプレートのないバージョン(「プレーンな古い関数」)は、テンプレートバージョンよりも優先されるべきです。
問題がどこにあるのか、誰かが手がかりを持っていますか?
c++ - 関数テンプレート - 明示的な特殊化とグローバル関数 (C++)
関数テンプレートは、関数を移植可能にし、任意のデータ型で使用できるようにするために使用されることを知っています。
また、特定のデータ型のより効率的な実装がある場合は、テンプレートの明示的な特殊化が行われます。
しかし、明示的な特殊化の代わりに、から呼び出すことができる非テンプレート関数をコーディングすることもできますmain
。これにより、コンパイラは非テンプレート関数を明示的に特殊化されたテンプレート化関数よりも速く見つけることができるため、処理時間を節約できます。これにより、効率が向上します。
では、非テンプレート関数を呼び出すだけの代替手段があるのに、なぜ明示的な特殊化を使用するのでしょうか?
間違っていたら訂正してください!
編集 1:
教授から、関数テンプレートを作成して関数を呼び出すときはいつでもmain
、コンパイラは最初にテンプレート化された関数を探し、それを見つけることができない場合は関数テンプレートを検索し、そこから順番に関数テンプレートを検索すると言われました。テンプレート化された関数を作成し、それを呼び出します。
c++ - 静的ライブラリで明示的なテンプレートの特殊化のシンボルが欠落しているのはなぜですか?
次のコードをコンパイルすると、次のようになります。
静的ライブラリを取得し、ライブラリでnmを実行すると、次の結果が得られます。
ただし、次のコードをコンパイルすると、テンプレートクラスの明示的な特殊化を追加したことを除いて同じです...
...そして同じコマンドを再実行します:
一致する記号がありません。どういうわけか、私が明示的に要求したにもかかわらず、コンパイラーはテンプレートをインスタンス化しません。
誰かがここで何が起こっているのか私に説明できますか?
c++ - この明示的な特殊化をどのように行う必要がありますか?
以下の設計は可能ですか?:
可能であれば、doSomethingに明示的な特殊化を行って、最終的に次のようなバージョンを作成します。
これは不可能のようですが、仕事をするための構文が見つからないので、すべてのテンプレート引数をテンプレートクラス自体に渡すように、次のように設計する必要があると思いました。
次に、コンパイルすらしなかった部分的な特殊化を試しました。
明示的な特殊化で次のエラーが発生しました。
エラー#1:クラステンプレート名に続くテンプレート引数リストは、テンプレートパラメータリストで使用されている順序でパラメータをリストする必要があります。
エラー#2:'Container1':テンプレート引数が少なすぎます。
c++ - How to do one explicit specialization for multiple types?
Considering a template function like below how is it possible to do explicitly specialize one version of function for multiple types:
The intention is to have one specialization instead of multiple following ones because //something is the same:
any method to achieve one specialization?