関数シグネチャで `std::enable_if` を避けるべきですか?
Oct 31, 2024 am 05:57 AM手続き上の障害: 関数シグネチャでの std::enable_if の回避
Scott Meyers の近刊予定の書籍 EC 11 では、関数シグネチャでの std::enable_if の回避を推奨しています。関数やクラスをオーバーロード解決から条件付きで削除できる汎用性にもかかわらず、特定の制限と読みやすさの問題により、その使用法を再検討する必要があります。
関数シグネチャで 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 サイトの他の関連記事を参照してください。

人気の記事

人気の記事

ホットな記事タグ

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











C言語関数によって返される値の種類は何ですか?返品値を決定するものは何ですか?

STL(ソート、検索、変換など)のアルゴリズムを効率的に使用するにはどうすればよいですか?
