異なる enable_if 条件を持つメンバー関数の選択
C では、enable_if は、次の条件に基づいて特定のコードを条件付きで有効または無効にするために使用されるツールです。テンプレート引数が特定の基準を満たしていること。これは、テンプレート パラメーターに基づいてクラスまたは関数の動作をカスタマイズする場合に便利です。
指定された例では、目標は、テンプレートのパラメーターに基づいて異なる動作をするメンバー関数 MyFunction を作成することです。パラメータ T は整数かどうか。意図された実装は、MyFunction の 2 つのオーバーロードを使用することです。1 つは T = int 用、もう 1 つは T != int 用です。
これを実現する 1 つのアプローチは、以下のコードに示すように、enable_if を使用することです。
<code class="cpp">template<typename T> struct Point { void MyFunction( typename std::enable_if<std::is_same<T, int>::value, T >::type* = 0) { std::cout << "T is int." << std::endl; } void MyFunction( typename std::enable_if<!std::is_same<T, int>::value, float >::type* = 0) { std::cout << "T is not int." << std::endl; } };</code>
ただし、このコードは、enable_if の使用方法が間違っているため、コンパイル エラーが発生します。 C では、テンプレート引数の置換はオーバーロードの解決中に行われます。この場合、メンバ関数のインスタンス化時に T の型がわかっているため、置換は行われません。
この問題を解決するには、ダミーのテンプレート パラメータを導入してデフォルトを T に設定し、SFINAE を許可します。 (置換の失敗はエラーではありません) が正しく動作するには:
<code class="cpp">template<typename T> struct Point { template<typename U = T> typename std::enable_if<std::is_same<U, int>::value>::type MyFunction() { std::cout << "T is int." << std::endl; } template<typename U = T> typename std::enable_if<std::is_same<U, float>::value>::type MyFunction() { std::cout << "T is not int." << std::endl; } };</code>
このアプローチにより、T の値に基づいて MyFunction の正しいバージョンが選択されます。
以上がC でenable_if を使用して条件付きメンバー関数のオーバーロードを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。