Scott Meyers の近刊予定の書籍 EC 11 では、関数シグネチャでの std::enable_if の回避を推奨しています。関数やクラスをオーバーロード解決から条件付きで削除できる汎用性にもかかわらず、特定の制限と読みやすさの問題により、その使用法を再検討する必要があります。
関数パラメータ:
<code class="cpp">template<typename T> struct Check1 { template<typename U = T> U read(typename std::enable_if< // Option 1: As function parameter std::is_same<U, int>::value >::type* = 0) { return 42; } };</code>
テンプレートパラメータ:
<code class="cpp">template<typename T> struct Check2 { template<typename U = T, typename std::enable_if< // Option 2: As template parameter std::is_same<U, int>::value, int >::type = 0> U read() { return 42; } };</code>
戻り値の型:
<code class="cpp">template<typename T> struct Check3 { template<typename U = T> typename std::enable_if<std::is_same<U, int>::value, U>::type read() { // Option 3: As return type return 42; } };</code>
最適な解決策には、enable_if をテンプレート パラメーターに配置することが含まれます。このアプローチにはいくつかの利点があります。
可読性の向上:
enable_if の使用法が戻り値/引数の型から分離され、明確さが向上し、煩雑さが軽減されます。
普遍的な適用性:
他のオプションとは異なり、テンプレート パラメーターの配置は追加の引数なしでコンストラクターと演算子に適用できます。
戻り値の型の除外:
「回避」関数シグネチャの std::enable_if は、主に通常の関数シグネチャでの使用に対処していますが、テンプレート特殊化の戻り値の型には適用されます。この懸念は、enable_if と戻り値の型をマージする際の可読性の問題に起因します。
メンバー関数と非メンバー関数:
この原則は、メンバー関数テンプレートと非メンバー関数テンプレートの両方に当てはまります。
以上が関数シグネチャで `std::enable_if` を避けるべきですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。