式 SFINAE を理解する
C プログラミングのコンテキストでは、式 SFINAE (置換失敗はエラーではありません) を使用して関数を条件付きで適用できます。関数内の式の有効性に基づくオーバーロード宣言。
動作中の式 SFINAE
次のコード例を考えてみましょう。
例 1:
template <int I> struct A {}; char xxx(int); char xxx(float); template <class T> A<sizeof(xxx((T)0))> f(T) {}
f() 関数は、サイズに設定したパラメーターを持つ構造体 A を返します。テンプレート パラメーター T のキャスト値を (T)0 に指定して xxx() を呼び出した結果。
例 2:
struct X {}; struct Y { Y(X) {} }; template <class T> auto f(T t1, T t2) -> decltype(t1 + t2); // #1 X f(Y, Y); // #2 X x1, x2; X x3 = f(x1, x2); // deduction fails on #1 (cannot add X+X), calls #2
例 2 、 f() 関数のオーバーロードでは、数値型の追加 (#1) と X から Y の構築 (#2) の両方が可能です。 f() 関数が x1 と x2 (X オブジェクト) で呼び出される場合、最初のオーバーロードは X オブジェクトに対して無効であるため、Y を構築するオーバーロードが選択されます。
一般的な使用例: 特性定義
式 SFINAE は特性定義でよく使用され、特定のメンバー関数の存在に基づいて特性を定義できます。クラスで。例:
struct has_member_begin_test { template <class U> static auto test(U* p) -> decltype(p->begin(), std::true_type()); template <class> static auto test(...) -> std::false_type; }; template <class T> struct has_member_begin : decltype(has_member_begin_test::test<T>(0)) {};
has_member_begin 構造体テンプレートを使用して、クラスに begin() メンバー関数があるかどうかを確認できます。式 SFINAE を使用して、begin() 式が有効な型または式を返すかどうかを判断し、有効な場合は std::true_type を返し、そうでない場合は std::false_type を返します。
重要な注意事項:
Expression SFINAE は比較的最近 C 言語に追加されたもので、すべてのコンパイラが完全にサポートしているわけではありません。コード内で Expression SFINAE に関する問題が発生した場合は、コンパイラのバージョンがそれをサポートしているかどうかを確認することが重要です。
以上が式 SFINAE (置換失敗はエラーではない) は C でどのように機能するのでしょうか?また、それを使用して特性を定義し、関数オーバーロードを条件付きで適用する方法を教えてください。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。