ホームページ >バックエンド開発 >C++ >C でenable_if を使用して条件付きメンバー関数のオーバーロードを実装する方法

C でenable_if を使用して条件付きメンバー関数のオーバーロードを実装する方法

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-28 14:18:30811ブラウズ

How to Implement Conditional Member Function Overloads Using enable_if in C  ?

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

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