問題タブ [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++ - 名前空間内のクラスのメソッド テンプレートの特殊化
次のコンパイル時の「トリック」(ADL に基づく) を使用して、同じ名前空間内のクラスによってのみ有効/定義/呼び出し可能な関数を作成しています。
Foo::Bar
ここで、この原則 (または同様のもの) を使用して、各名前空間に属するクラス (以下)の特殊化を生成したいと思いますFamily1
。
保守を容易にし、各名前空間に多数のクラスがあるため、可能であれば、名前空間内のすべてのクラスに名前を付けずにこのチェックを実行したいと考えています。
c++ - テンプレートのオーバーロードとSFINAEは関数でのみ機能し、クラスでは機能しません
コンパイラがこのコードのみを受け入れる理由を誰かが説明できますか
しかし、これではありません:
コンパイラーは、2番目のクラスのテンプレートを最初のクラスのテンプレートの再定義と見なします。
c++ - このhas_memberクラステンプレートはどのように機能しますか?
次のクラステンプレート(ここから取得)がどのように機能するかを理解しようとしていますが、正しく理解できませんでした。
具体的には、その目的BaseMixin
や存在がわかりませんoperator()
。また、Base
それから派生しているので、私もわかりません。
さらに具体的には、テンプレートパラメータType
が定義されている場合operator()
、なぜSFINAEがトリガーされ、最初のdeduce()
関数が無視され、2番目の関数が選択されるのでしょうか。
とにかく、これは私のテストコードです:
Output(ideone):
c++ - result_ofが機能しません
両方のtypedefでエラーが発生します
c++ - パラメータの型に応じてテンプレート関数コードを作成する最も簡単な方法は何ですか
一部の Timestamp プロパティ (クラスは から継承) をチェックするテンプレート関数を作成したいと考えてTimed
いますが、タイムスタンプを持たない型に対しても機能する必要があります。私が見つけた最良の(そしてまだかなり醜い)解決策は次のとおりです。
これは、1 つの機能に対して 3 つの機能です。これを達成するためのより簡単な方法はありますboost::is_base_of
か? if 条件または boost::enable if で同様に、関数出力を から派生していないクラスの一種の定数に変換しますTimed
。残念ながら、仮想機能を使用したソリューションはオプションではありません。
c++ - テンプレート化された operator() に最適な is_callable トレイトを作成する方法
私は is_callable 特性を次のように定義しています:
私の質問は、引数を持たず、戻り値の型 T のみを持つテンプレート化された operator() を検出する方法です
また
このような状況はめったにないことはわかっていますが、引数なしで 1 つ以上のテンプレート引数を使用してテンプレート化された operator() の存在を検出する方法はありますか?
c++ - is_container trait が std::set SFINAE の問題で失敗する
主にデバッグの目的で、std コンテナー用のストリーム演算子を作成しようとしています。
次のコードがあります。
私はこれが完璧とはほど遠いことを認識しています (建設的なコメントを歓迎します) が、私が抱えている問題は、ベクター、deque、およびリストに対してはうまく機能するが、セットでは一致しないことです。セットにはまだイテレーター インターフェイスがあるため、その理由はわかりません始まりと終わり。
ありがとう。
編集:g ++(GCC)4.6.2 2012012でテスト済みclangバージョン3.0
EDIT2: decltype を使用して動作するようになりましたが、これは最適ではありません。これは、期待どおりの動作をする(イテレータを返す)と断言できないためです。
そもそもセットが何を返したのか正確にはわかりません。おそらく誰かがTMPをデバッグする方法を持っていれば、それは良いでしょう。
c++ - 符号付きと符号なしの SFINAE の違い
さまざまな算術型を半精度浮動小数点型 (uint16_t
最低レベルの a のみ) に変換する関数があり、SFINAE と を使用して、整数型と浮動小数点型のさまざまな関数がありstd::enable_if
ます。
これらは、明示的なインスタンス化によって、ユニバーサル テンプレート コンストラクターから内部的に呼び出されます。
これはコンパイルされ、問題なく動作します。ここで、2 番目の関数を 2 つの関数に置き換えることで、符号付き整数と符号なし整数を区別しようとします。
しかし、このVS2010をコンパイルしようとすると、
エラー C2995:
"uint16_t math::detail::conversion::to_half( std::enable_if<std::tr1::is_integral<_Ty>::value && std::tr1::is_signed<_Ty>::value, T>::type )"
: 関数テンプレートは既に定義されています。
したがって、2 つのテンプレートを区別することはできないようですが、整数バージョンと浮動小数点バージョンでは明らかに問題はありませんでした。
しかし、私はそれほどテンプレートの魔術師ではないので、ここで明らかな何かが欠けている可能性があります (または、実際には機能するはずで、VS2010 のバグにすぎない可能性があります)。では、なぜこれが機能しないのでしょうか?また、プログラミングのオーバーヘッドをできるだけ少なくし、標準のみの機能の制限内で (可能であれば)、どのように機能させることができるのでしょうか?
c++ - 派生クラス用のクラステンプレートメソッドの特殊化
doIt()
以下に示すように、共通の基本クラスを共有するクラスのコードの次のビットでメソッドを特殊化するのに役立ちます。
c++ - 未定義のメンバー関数があるにもかかわらず、次のコードがコンパイルされるのはなぜですか?
私はこのコードの作業の途中で、ビルド ボタンを押す前にこれは明らかにコンパイルされないだろうと考えました。コンパイルだけでなく、リンクも機能することに驚きました。
私が推測すると、SFINAE がコンパイルの責任を負っていると言うでしょう... そうですか?
編集:私はVisual-C++ 2008を使用しています.VSの奇妙な癖かもしれません