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