ホームページ >バックエンド開発 >C++ >テンプレート引数に基づいてメンバー関数を選択するためにenable_ifを使用する方法は?

テンプレート引数に基づいてメンバー関数を選択するためにenable_ifを使用する方法は?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-26 12:44:29358ブラウズ

How to Use enable_if to Select Member Functions Based on Template Arguments?

さまざまなenable_if条件を使用したメンバー関数の選択

enable_ifメタ関数は、テンプレート関数のパラメーターを指定し、それに基づいて適切なメンバー関数を選択するために利用されます。 。次のコードを考えてみましょう:

<code class="cpp">template<typename T>
struct Point
{
  // Check if T is int and call MyFunction for int
  void MyFunction(typename std::enable_if<std::is_same<T, int>::value, T &>::type* = 0)
  {
    std::cout << "T is int." << std::endl;
  }

  // Check if T is not int and call MyFunction for non-int
  void MyFunction(typename std::enable_if<!std::is_same<T, int>::value, float &>::type* = 0)
  {
    std::cout << "T is not int." << std::endl;
  }
};</code>

ただし、このコードでは、「'struct std::enable_if' に 'type' という名前の型がありません」というコンパイラ エラーが発生する可能性があります。

enable_if

enable_if を理解すると、オーバーロードの解決時に実行可能な関数オーバーロードのみが考慮されるようになります。テンプレート引数の置換が失敗した場合、そのオーバーロードは候補セットから削除されます。

上記の例では、テンプレート引数 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>

以上がテンプレート引数に基づいてメンバー関数を選択するためにenable_ifを使用する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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