ホームページ バックエンド開発 C++ SFINAE がクラス テンプレートのメンバー関数で失敗するのはなぜですか?

SFINAE がクラス テンプレートのメンバー関数で失敗するのはなぜですか?

Nov 05, 2024 am 04:26 AM

Why Does SFINAE Fail with Member Functions in Class Templates?

クラス テンプレートのメンバー関数 SFINAE: 詳細な説明

C の世界では、SFINAE (Substitution Failure Is Not An Error) により、コンパイル中のインスタンス化エラーを防止することによるテンプレートの最適化。ただし、クラス テンプレートのメンバー関数を扱う場合、SFINAE は予期しない動作をする可能性があります。

メンバー関数 SFINAE の問題

次のコードを考えてみましょう:

<code class="cpp">template &lt;typename T&gt;
struct Foo
{
    typename std::enable_if&lt;std::is_same&lt;T, A&gt;::value&gt;::type bar();
    typename std::enable_if&lt;std::is_same&lt;T, B&gt;::value&gt;::type bar();
};</code>
ログイン後にコピー

予想に反して、このコードではエラー メッセージが表示されます。 SFINAE は、クラス テンプレート内のメンバー関数に対して意図したとおりに動作しません。

SFINAE と推定されたテンプレート引数

問題の核心は、SFINAE が推定されたテンプレート引数に依存していることにあります。 。これは、テンプレート引数が関数呼び出しから推定される場合にのみ機能します。メンバー関数の場合、テンプレート引数は推定されず、代わりに明示的に提供されます。

推定された引数を使用した解決策

この問題に対処するには、次のようなコード:

<code class="cpp">template&lt;typename T&gt;
struct Foo
{
    template&lt;typename U = T&gt;
    typename std::enable_if&lt;std::is_same&lt;U,A&gt;::value&gt;::type bar()
    {
    }

    template&lt;typename U = T&gt;
    typename std::enable_if&lt;std::is_same&lt;U,B&gt;::value&gt;::type bar()
    {
    }
};</code>
ログイン後にコピー

ここで、Foo()(x) を呼び出すと、コンパイラはテンプレートを推定します。引数 T を指定し、x に基づいて正しいオーバーロードを選択します。このアプローチにより、SFINAE が期待どおりに機能できるようになります。

代わりに: 明示的なクラス テンプレートの特殊化

クラスの構造が重要で変更できない場合は、代替ソリューションとして次のような方法があります。明示的なクラス テンプレートの特殊化:

<code class="cpp">template &lt;typename&gt; struct Foo;

template &lt;&gt; struct Foo&lt;A&gt; { void bar() {} };
template &lt;&gt; struct Foo&lt;B&gt; { void bar() {} };</code>
ログイン後にコピー

ここで、コンパイラは、どの特殊化に基づいてインスタンス化するかを正確に認識します。提供されるタイプ。スペシャライゼーションの選択には SFINAE には依存しません。

以上がSFINAE がクラス テンプレートのメンバー関数で失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C言語関数によって返される値の種類は何ですか?返品値を決定するものは何ですか? C言語関数によって返される値の種類は何ですか?返品値を決定するものは何ですか? Mar 03, 2025 pm 05:52 PM

C言語関数によって返される値の種類は何ですか?返品値を決定するものは何ですか?

GULC:Cライブラリはゼロから構築されています GULC:Cライブラリはゼロから構築されています Mar 03, 2025 pm 05:46 PM

GULC:Cライブラリはゼロから構築されています

c言語関数形式文字ケース変換手順 c言語関数形式文字ケース変換手順 Mar 03, 2025 pm 05:53 PM

c言語関数形式文字ケース変換手順

C言語関数の定義と呼び出しルールは何ですか、そして C言語関数の定義と呼び出しルールは何ですか、そして Mar 03, 2025 pm 05:53 PM

C言語関数の定義と呼び出しルールは何ですか、そして

明確な使用法とフレーズ共有 明確な使用法とフレーズ共有 Mar 03, 2025 pm 05:51 PM

明確な使用法とフレーズ共有

メモリに保存されているC言語関数の返品値はどこにありますか? メモリに保存されているC言語関数の返品値はどこにありますか? Mar 03, 2025 pm 05:51 PM

メモリに保存されているC言語関数の返品値はどこにありますか?

C標準テンプレートライブラリ(STL)はどのように機能しますか? C標準テンプレートライブラリ(STL)はどのように機能しますか? Mar 12, 2025 pm 04:50 PM

C標準テンプレートライブラリ(STL)はどのように機能しますか?

STL(ソート、検索、変換など)のアルゴリズムを効率的に使用するにはどうすればよいですか? STL(ソート、検索、変換など)のアルゴリズムを効率的に使用するにはどうすればよいですか? Mar 12, 2025 pm 04:52 PM

STL(ソート、検索、変換など)のアルゴリズムを効率的に使用するにはどうすればよいですか?

See all articles