ホームページ > バックエンド開発 > C++ > SFINAE の動作は、C 関数オーバーロードの戻り値の型とテンプレート パラメーターの間でどのように異なりますか?

SFINAE の動作は、C 関数オーバーロードの戻り値の型とテンプレート パラメーターの間でどのように異なりますか?

Linda Hamilton
リリース: 2024-12-27 04:43:51
オリジナル
634 人が閲覧しました

How Does SFINAE Behavior Differ Between Return Types and Template Parameters in C   Function Overloads?

戻り値の型とテンプレート パラメーターにおける SFINAE の動作の差異

C では、代替失敗はエラーではない (SFINAE) イディオムにより条件付きが可能になりますテンプレートのメタプログラミングと型の特性に基づいた関数のオーバーロード。ただし、関数テンプレート宣言内の配置に応じて SFINAE の動作が異なる場合があります。

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

template<typename T,
         typename = typename std::enable_if<
                        std::is_integral<T>::value>::type>
void foo(T);  // Incorrect placement, triggers error

template<typename T,
         typename = typename std::enable_if<
                        std::is_floating_point<T>::value>::type>
void foo(T);  // Incorrect placement, triggers error

template<typename T>
void foo(T)    // Correct placement
    -> typename std::enable_if<
            std::is_integral<T>::value>::type;

template<typename T>
void foo(T)    // Correct placement
    -> typename std::enable_if<
            std::is_floating_point<T>::value>::type;
ログイン後にコピー

最初のオーバーロード セット (不適切な配置) では、戻り値の型ではなく SFINAE をテンプレート パラメーターに配置すると、コンパイル エラーが発生します。これは、デフォルトのテンプレート引数 (この場合は ::type サフィックス) がオーバーロードの等価性を決定する際に考慮されないためです。その結果、コンパイラは関数を同じシグネチャを持つ重複した宣言として扱います。

ただし、オーバーロードの 2 番目のセット (正しい配置) では、SFINAE が戻り値の型に適用され、これにはテンプレートのメタプログラミングが含まれます。この配置により、テンプレート パラメーターを参照する式が関数シグネチャの一部となることが保証されます。その結果、コンパイラはオーバーロードを別個のエンティティとして認識し、SFINAE が適切に機能できるようになります。

以上がSFINAE の動作は、C 関数オーバーロードの戻り値の型とテンプレート パラメーターの間でどのように異なりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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