問題タブ [template-argument-deduction]
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++ - テンプレート引数推定におけるあいまいな呼び出しの解決
典型的な関数テンプレートの署名:
問題は、次のように呼び出すときです。
または明示的に呼び出すことなく他の方法
の場合、 T の型は でありint
、 でオーバーフローして悪い結果が生じるリスクがありfn
ます。
では、どのように特化fn
して
明確であり、結果は?T
に設定されます。Iterator::value_type
選択肢
g++/clang++ からのあいまいな呼び出しエラーが発生します。
編集:
私は今私の間違いを見て、上記のコードは以下の @Lightness Races の提案で動作します。助けてくれてありがとう。
c++ - 可変個引数テンプレート値と可変個引数推定型の混合
以下は標準によって完全に定義されていますか?
下でうまくコンパイルされますg++ 4.8
が、それは正常なのだろうか。
c++ - テンプレート テンプレート パラメーターを使用した引数推定
クラステンプレートがあります。const_iterator
このクラス テンプレート内で、sのコレクションでsを受け入れるメンバー関数テンプレートを定義しようとしていますstring
。コレクション自体は任意の種類の StdLib コレクションにすることができますが、現実的には か のいずれかになりvector
ますlist
。
コレクションは任意の型になる可能性があるため、template-template
パラメーターを使用してコレクションの型を指定しています。ただし、常に のコレクションになりstring
ます。メンバー関数を呼び出すときにコレクションの型を指定する必要がないように、テンプレートの引数推定が機能するようにします。
私の意図したユースケースに似た SSCCE に続くコード。
これまでのところ、クラス定義 ( Live Demo ) は次のとおりです。
クラス テンプレートのインスタンス化のコンパイルが成功します。
しかし、引数の演繹法を活用しようとすると (それがなければ、この演習全体はほとんど無意味です):
GCC は、テンプレート引数を推測できないと文句を言います。
最終的に、私が本当に気にかけているDoIt
のは、コレクションの begin および end イテレータで呼び出せることだけですstring
。コレクションの実際のタイプはvector
またはlist
のいずれかであり、テンプレート引数を指定する必要も、コンテナーに基づいてオーバーロードする必要もありません。
どうすればこれを機能させることができますか?
私の実際のユースケースは C++03 であることに注意してください。C++11 ソリューションは歓迎されますが、C++03 ソリューションのみを受け入れることができます。
c++ - size_t 以外の整数を持つ std::array の C++ テンプレート パラメーター推定
可変個引数テンプレート関数での構造体の回避に示されているソリューションを必要に応じて適応させようとしています。しかし、G++ の動作がわかりません。次の関数を検討してください。
その後、コール
と不平を言うGCCと一致しません
ただし、 orに変更unsigned Size
すると一致します。ここで何が起こっているのかよくわかりません。への呼び出しのパラメーターが に変換されていませんか?unsigned long Size
size_t
Size
std::array<T, Size>
size_t
c++ - 基本クラス メンバーへのポインターからのテンプレート推定
何が間違っているのかわかりません。基本クラス メンバへのポインタからのテンプレート推論の問題 - &DerivedClass::BaseClassMemeber。
完全な例:
いくつかの回避策を見つけることができます。たとえば、もう 1 つのテンプレート パラメーター、static_cast、暗黙的な部分特殊化 (Test) による追加のテスト関数のオーバーロードです。
しかし、コンパイラが &DerivedClass::BaseClassMemeber で明示的に指定されたクラスを使用できない理由に興味があります。それが問題です。そして、問題に対するより洗練された解決策がある場合は、歓迎します。
c++ - 実行不可能な関数テンプレートの型推定
この質問とコメント セクションに対する彼の回答で、Johannes Schaubは、渡されたよりも多くの引数を必要とする関数テンプレートに対してテンプレート型推定を実行しようとすると、「一致エラー」があると述べています。
他の質問のコンテキストでは、関連するのは、関数テンプレートの型推定が成功するかどうか (および置換が行われるかどうか) です。
の最初の関数テンプレートfoo
をインスタンス化するときT == int
に、置換によって の直接のコンテキストにない無効な型が生成されますfoo
。これはハードエラーにつながります(これが関連する質問です。)
ただし、foo
そのテンプレート引数を推測させる場合、g++ と clang++ はインスタンス化が行われないことに同意します。Johannes Schaub が説明しているように、これは「一致エラー」があるためです。
質問: 「一致エラー」とは何ですか? また、規格のどこでどのように指定されていますか?
foo(42)
別の質問:とfoo<int>(42)
g++ に違いがあるのはなぜですか?
これまでに見つけた/試したこと:
[over.match.funcs]/7 と [temp.over] は、関数テンプレートのオーバーロード解決の詳細を説明しているようです。後者は、 のテンプレート パラメータの置換を義務付けているようですfoo
。
興味深いことに、[over.match.funcs]/7は、関数テンプレート (特殊化) の実行可能性をチェックする前に、[temp.over] で説明されているプロセスをトリガーします。同様に、型推論は、たとえば、デフォルトの関数引数を考慮しません (推論されないコンテキストにすることを除いて)。私の知る限り、生存率には関係ないようです。
もう 1 つの重要な側面は、型推定の指定方法です。T const&
単一の関数パラメーターに作用しますが、テンプレートパラメーターを含む/依存するパラメータータイプ( など)とそうでないタイプ( など)を区別する場所がわかりませんint
。
しかし、g++ では、テンプレート パラメーターを明示的に指定すること (ハード エラー) と、それらを推論させること (推論の失敗 / SFINAE) との間に違いがあります。なんで?
c++ - タプルを使用したラムダでテンプレート引数の推論が失敗する
特定の要素の特性について STL コンテナーにクエリを実行し、結果セットを返すことができるクエリ関数を作成しようとしています。これは実際には、通常の STL 操作 (具体的には copy_if と back_inserter) に関するシンタックス シュガーにすぎません。
そして、これがコンパイラ出力です(Clang 3.3)