ホームページ > バックエンド開発 > C++ > 式 SFINAE (置換失敗はエラーではない) は C でどのように機能するのでしょうか?また、それを使用して特性を定義し、関数オーバーロードを条件付きで適用する方法を教えてください。

式 SFINAE (置換失敗はエラーではない) は C でどのように機能するのでしょうか?また、それを使用して特性を定義し、関数オーバーロードを条件付きで適用する方法を教えてください。

DDD
リリース: 2024-11-11 04:49:03
オリジナル
680 人が閲覧しました

How does Expression SFINAE (Substitution Failure Is Not An Error) work in C   and how can it be used to define traits and conditionally apply function overloads?

式 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート