問題タブ [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.

0 投票する
2 に答える
283 参照

c++ - 名前空間内のクラスのメソッド テンプレートの特殊化

次のコンパイル時の「トリック」(ADL に基づく) を使用して、同じ名前空間内のクラスによってのみ有効/定義/呼び出し可能な関数を作成しています。

Foo::Barここで、この原則 (または同様のもの) を使用して、各名前空間に属するクラス (以下)の特殊化を生成したいと思いますFamily1

保守を容易にし、各名前空間に多数のクラスがあるため、可能であれば、名前空間内のすべてのクラスに名前を付けずにこのチェックを実行したいと考えています。

0 投票する
2 に答える
3223 参照

c++ - テンプレートのオーバーロードとSFINAEは関数でのみ機能し、クラスでは機能しません

コンパイラがこのコードのみを受け入れる理由を誰かが説明できますか

しかし、これではありません:

コンパイラーは、2番目のクラスのテンプレートを最初のクラスのテンプレートの再定義と見なします。

0 投票する
2 に答える
1753 参照

c++ - このhas_memberクラステンプレートはどのように機能しますか?

次のクラステンプレート(ここから取得)がどのように機能するかを理解しようとしていますが、正しく理解できませんでした。

具体的には、その目的BaseMixinや存在がわかりませんoperator()。また、Baseそれから派生しているので、私もわかりません。

さらに具体的には、テンプレートパラメータTypeが定義されている場合operator()、なぜSFINAEがトリガーされ、最初のdeduce()関数が無視され、2番目の関数が選択されるのでしょうか。


とにかく、これは私のテストコードです:

Output(ideone):

0 投票する
1 に答える
1810 参照

c++ - result_ofが機能しません

両方のtypedefでエラーが発生します

0 投票する
3 に答える
155 参照

c++ - パラメータの型に応じてテンプレート関数コードを作成する最も簡単な方法は何ですか

一部の Timestamp プロパティ (クラスは から継承) をチェックするテンプレート関数を作成したいと考えてTimedいますが、タイムスタンプを持たない型に対しても機能する必要があります。私が見つけた最良の(そしてまだかなり醜い)解決策は次のとおりです。

これは、1 つの機能に対して 3 つの機能です。これを達成するためのより簡単な方法はありますboost::is_base_ofか? if 条件または boost::enable if で同様に、関数出力を から派生していないクラスの一種の定数に変換しますTimed。残念ながら、仮想機能を使用したソリューションはオプションではありません。

0 投票する
2 に答える
1899 参照

c++ - テンプレート化された operator() に最適な is_callable トレイトを作成する方法

私は is_callable 特性を次のように定義しています:

私の質問は、引数を持たず、戻り値の型 T のみを持つテンプレート化された operator() を検出する方法です

また

このような状況はめったにないことはわかっていますが、引数なしで 1 つ以上のテンプレート引数を使用してテンプレート化された operator() の存在を検出する方法はありますか?

0 投票する
2 に答える
854 参照

c++ - is_container trait が std::set SFINAE の問題で失敗する

主にデバッグの目的で、std コンテナー用のストリーム演算子を作成しようとしています。

次のコードがあります。

私はこれが完璧とはほど遠いことを認識しています (建設的なコメントを歓迎します) が、私が抱えている問題は、ベクター、deque、およびリストに対してはうまく機能するが、セットでは一致しないことです。セットにはまだイテレーター インターフェイスがあるため、その理由はわかりません始まりと終わり。

ありがとう。

編集:g ++(GCC)4.6.2 2012012でテスト済みclangバージョン3.0

EDIT2: decltype を使用して動作するようになりましたが、これは最適ではありません。これは、期待どおりの動作をする(イテレータを返す)と断言できないためです。

そもそもセットが何を返したのか正確にはわかりません。おそらく誰かがTMPをデバッグする方法を持っていれば、それは良いでしょう。

0 投票する
3 に答える
1507 参照

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 のバグにすぎない可能性があります)。では、なぜこれが機能しないのでしょうか?また、プログラミングのオーバーヘッドをできるだけ少なくし、標準のみの機能の制限内で (可能であれば)、どのように機能させることができるのでしょうか?

0 投票する
2 に答える
449 参照

c++ - 派生クラス用のクラステンプレートメソッドの特殊化

doIt()以下に示すように、共通の基本クラスを共有するクラスのコードの次のビットでメソッドを特殊化するのに役立ちます。

0 投票する
5 に答える
674 参照

c++ - 未定義のメンバー関数があるにもかかわらず、次のコードがコンパイルされるのはなぜですか?

私はこのコードの作業の途中で、ビルド ボタンを押す前にこれは明らかにコンパイルされないだろうと考えました。コンパイルだけでなく、リンクも機能することに驚きました。

私が推測すると、SFINAE がコンパイルの責任を負っていると言うでしょう... そうですか?

編集:私はVisual-C++ 2008を使用しています.VSの奇妙な癖かもしれません