問題タブ [sfinae]
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++ - SFINAE 原則を使用するとオーバーロードされた関数があいまいになる
VS7.1 で記述されたコードを見つけたので、MacOSX で動作させようとしています。以下のコード スニペットは、 SFINAEの原則に関するものだと理解しています。私が理解していることから、コードは、コンパイル時にテンプレートのインスタンス化マジックに依存することで、何かの型を知るために使用されます。つまり、適切なオーバーロードは、テンプレート引数を確認することで選択されます。
これが私が持っているコードです。問題のみを表示するためにやや単純化されています。
私は単にこれを次のように使用しています:
上記のコードをコンパイルすると、int を使用するときに Type の typedef が欠落しているため、適切に動作し、最上位のクラスが選択されます。
代わりに char を使用すると...
...コンパイラは、どちらを使用するかわからないため、あいまいな Select 関数について文句を言います。私が読んだことから、オーバーロードの解決では、省略記号パラメーターが優先されません (...)。したがって、最初のものを選択することを知っている必要があります。
コードは少なくとも VS7.1 では正常に動作していましたが、MacOSX の gcc や Linux の gcc4.4 では動作しませんでした。
これを修正する方法はありますか?多分それは通常別の方法で行われますか?
ありがとう!
更新: 私が提供したサンプル コードが少し単純化しすぎていることに気付きました。誤ってそのように見せたとしても、ここで型をチェックしているとは思えないからです。ここにコードがないので、今夜はもう少し情報を集める必要があります。そのために残念。
UPDATE2: 元のコードに慣れていないか、このようにテンプレートを使用していることが原因で、私のプレゼンテーションが悪い場合でも。その間、もう少し情報を掘り下げます。これらの構造が何らかの理由で X にあり、私が指定した名前がすべて間違っていると仮定しましょう。コンパイラの問題はどうですか? ここで適切なオーバーロードされた関数を選択できないのはなぜですか? これは私も興味深いです。私が言ったように、私は全体的な目的が何であるかをよりよく説明して戻ってきます.
編集
元のコードを詳しく見てみると、ここで提案されているように、boost::integral_constant と boost::enable_if を使用しています。問題は、テンプレートの引数がどのように推定されるかに特有のものであり、セットアップされた方法では機能しませんでした。ただし、ゲオルクが回答の最後に提案したことに従って、物事を修正して受け入れることができました。私は今、次のものを持っています:
これはうまくいきます。少し実験していると、Select 関数に 2 つの関数パラメーターがあると問題が発生することがわかりました。理由はわかりません。物事をよりよく理解したら、これに戻ります。
ご助力いただきありがとうございます。少なくとも、ここでの原則と、物事がどのように機能するかを理解しています。まだ不明な詳細のみ。
c++ - コンパイル時に適切なオーバーロードされた関数テンプレートを選択する方法は?
コンパイル時に適切なオーバーロードされた関数テンプレートを選択する方法を理解しようとしていますが、コンパイラが苦労しています。動作させることはできますが、何が起こっているのかわかりません。説明させてください。
以下のような2つの構造体AとBがあります。1 つは特別な機能を持ち、もう 1 つは通常の機能を持っています。
私の意図は、特別な関数が利用可能かどうかに応じて、コンパイル時に適切なオーバーロードされた関数テンプレートを選択するメカニズムを持つことです。構造体をパラメーターとして受け取る 2 つの関数を実行して、適切な関数を呼び出すことができるようにします。
これを次のようにテストしましたが、さまざまな結果が得られました。
run(a)
余分な引数や <> なしで使用したいと思います。これが機能しない場合、コードに何か問題がありますか?
また、ここで何が起こっているのか、なぜこれがこのようなことを推測しているのかを理解したいと思って<A>
いA
ますB
。標準が何を言っているのか、これがコンパイラ間で異なるのかどうかはわかりませんが、少なくともLinuxではgcc4.4.4、Macではgcc 4.0.1が説明したように機能します。
誰かがこれに光を当てることができますか?ありがとう!
c++ - なぜそれが機能するのですか?SFINAE
コード内のコメントを参照してください。
c++ - テンプレート クラスでメンバー関数を非表示にする
テンプレート クラスで一部のメンバー関数を非表示にすることは可能ですか? 次のようなものがあるとしましょう。
目的は、特定のケースでは increment() 関数のみが表示され、他のケースではインクリメント(T) メンバー関数のみが表示されるように、このクラスを使用することです。そのために、SFINAE で何かを考えることができます。
次に、たとえば次のようにテンプレートを使用します。
ただし、コンパイラはこれを許可していません。これが実現可能な他の方法はありますか?メンバー関数が実際にコンストラクターである場合にも機能しますか?
c++ - SFINAE を使用してグローバル演算子をチェックする<
いくつかの型を取り、それを文字列表現に変換するオーバーロードされたグローバルto_string()
関数がいくつか必要です。T
一般的なケースでは、次のように記述できるようにしたいと考えています。
template<typename T,class OutputStringType> inli
いくつかの型を取り、それを文字列表現に変換するオーバーロードされたグローバルto_string()
関数がいくつか必要です。T
一般的なケースでは、次のように記述できるようにしたいと考えています。
has_insertion_operator
これまでの私の実装は次のとおりです。
(これ
とこれから借りています。)それはうまくいくようです。しかし今、私はオーバーロードされたバージョンのto_string
forを持ちたいのですが、独自のメンバー関数を持っていません。つまり:operator<<
to_string()
の実装has_to_string
は次のとおりです。
(この部分は正常に動作しているようです。これはthisから適応されています。)ただし、次の場合:
私は得る:
SFINAEは起きていないようです。グローバルが利用可能かhas_insertion_operator
どうかを判断するように正しく記述するにはどうすればよいですか?operator<<
参考までに: g++ 4.2.1 (Mac OS X の Xcode の一部として出荷されるもの) を使用しています。また、Boost などのサードパーティ ライブラリを使用せずに、コードを標準の C++03 のみにしたいと考えています。
ありがとう!
ここに、開発者ツールにアクセスするためのショートカットがあります。
いくつかの型を取り、それを文字列表現に変換するオーバーロードされたグローバルto_string()
関数がいくつか必要です。T
一般的なケースでは、次のように記述できるようにしたいと考えています。
template<typename T,class OutputStringType> inli
いくつかの型を取り、それを文字列表現に変換するオーバーロードされたグローバルto_string()
関数がいくつか必要です。T
一般的なケースでは、次のように記述できるようにしたいと考えています。
has_insertion_operator
これまでの私の実装は次のとおりです。
(これ
とこれから借りています。)それはうまくいくようです。しかし今、私はオーバーロードされたバージョンのto_string
forを持ちたいのですが、独自のメンバー関数を持っていません。つまり:operator<<
to_string()
の実装has_to_string
は次のとおりです。
(この部分は正常に動作しているようです。これはthisから適応されています。)ただし、次の場合:
私は得る:
SFINAEは起きていないようです。グローバルが利用可能かhas_insertion_operator
どうかを判断するように正しく記述するにはどうすればよいですか?operator<<
参考までに: g++ 4.2.1 (Mac OS X の Xcode の一部として出荷されるもの) を使用しています。また、Boost などのサードパーティ ライブラリを使用せずに、コードを標準の C++03 のみにしたいと考えています。
ありがとう!
ここに、開発者ツールにアクセスするためのショートカットがあります。
c++ - C++ toString メンバー関数と ostream 演算子 << テンプレートによる統合
私は初心者の C++ 開発者で、テンプレートを介したオペレーターの統合について質問がtoString
あります。ostream
私はそのようなコードを持っています:
コードはエラーなしでコンパイルされ、アプリケーションは正常に実行されました。そのようなアプローチを使用するのは良いことですか?ブーストの助けを借りずに実装したかったのです。
c++ - SFINAEはT::referenceを検出しません
このstd::vector<T>
クラスはSTLコンテナの概念のモデルであるため、vectorを適切に実装するには、ネストされたtypedefとを含める必要がありvalue_type
ますreference
。これは、SFINAEを使用して検出できるはずです。ただし、私自身のテストでは、SFINAEを使用してネストされたvalue_type
typedefを検出できますが、何らかの理由で検出できませんreference
。
これは以下を出力します:Has nested typedef!
ただし、次のように置き換えるvalue_type
とreference
、次のようになります。
...プログラムはまったくコンパイルに失敗し、エラーが発生します:error: no matching function for call to test(std::vector<int, std::allocator<int> >)
SFINAEテクニックが機能するのに機能しないのはなぜT::value_type
ですかT::reference
?
c++ - decltype/SFINAE でオペレーターのサポートを検出する
(やや) 古い記事decltype
では、SFINAE と一緒に使用して、型が==
orなどの特定の演算子をサポートしているかどうかを検出する方法を探っています<
。
<
クラスが演算子をサポートしているかどうかを検出するコードの例を次に示します。
true
もちろん演算子をstd::string
サポートしているので、これは を出力し<
ます。ただし、演算子をサポートしていないクラスで使用しようとすると、コンパイラ エラーが発生します。<
したがって、SFINAE はここでは機能しません。これを GCC 4.4 と GCC 4.6 で試したところ、どちらも同じ動作を示しました。では、この方法で SFINAE を使用して、型が特定の式をサポートしているかどうかを検出することは可能ですか?
templates - MSVC10 SFINAEは、置換の失敗ではなく致命的なエラーを引き起こします
ここに(比較的)簡単なコードサンプルがあります。
type
MSVCはこれをスローし、それはのメンバーではないと言っていenable_if<false, int>
ます。これは一種のポイントです。私が得られないのは、これが単なる置換の失敗ではなく致命的なエラーを引き起こす理由です-GCCでは、このコードは期待どおりに動作し、きれいにコンパイルされます。
c++ - SFINAE を使用した C++ のポータブル typeof()?
重複の可能性:
C++03 に typeof 演算子がない?
テンプレートを使用して、C++0x 以前の C++ で移植可能な式のコンパイル時の型を取得することは可能ですか?
何かのようなもの:
ただし、テンプレートを使用しているため、明らかにわずかに異なる構文が必要になる場合があります。
(ここや Web の他の場所で多くの重複を見てきましたが、それらはコンパイラ固有の機能または C++0x (C++11?) のdecltype
機能に依存しているようです。)