ホームページ  >  記事  >  バックエンド開発  >  関数の戻り値の型で `std::enable_if` の使用を避けるべき理由は何ですか?

関数の戻り値の型で `std::enable_if` の使用を避けるべき理由は何ですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-31 06:02:30631ブラウズ

Why Should You Avoid Using `std::enable_if` in Function Return Types?

関数シグネチャで std::enable_if を避けるように努める理由?

std::enable_if は C の多用途ツールです。複数の方法で、指定された基準に基づいて関数またはクラスを条件付きで定義します。ただし、Scott Meyers は関数シグネチャでの使用に対して警告しています。この推奨事項を理解するには、std::enable_if で利用可能なさまざまな戦略とその影響を調べる必要があります。

実装オプション:

  1. 関数パラメータ:
<code class="cpp">template<typename T>
struct Check1
{
    template<typename U = T>
    U read(typename std::enable_if<std::is_same<U, int>::value>::type* = 0) { return 42; }

    template<typename U = T>
    U read(typename std::enable_if<std::is_same<U, double>::value>::type* = 0) { return 3.14; }   
};</code>
  1. テンプレートパラメータ:
<code class="cpp">template<typename T>
struct Check2
{
    template<typename U = T, typename std::enable_if<std::is_same<U, int>::value, int>::type = 0>
    U read() { return 42; }

    template<typename U = T, typename std::enable_if<std::is_same<U, double>::value, int>::type = 0>
    U read() { return 3.14; }   
};</code>
  1. 戻り値の型:
<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() {
        return 42;
    }

    template<typename U = T>
    typename std::enable_if<std::is_same<U, double>::value, U>::type read() {
        return 3.14;
    }   
};</code>

好ましいアプローチ:

最も好ましいアプローチは、テンプレート パラメーターにenable_if を配置することです。この手法には、明確さと汎用性の両方の利点があります。

明確さ:

enable_if 句を戻り値や引数の型から区別しておくことができるため、コードがより読みやすくなります。混乱を減らすためにエイリアス テンプレートを使用したとしても、他のアプローチでマージされた句は依然として別個の異なる概念を組み合わせています。

汎用性:

この手法は普遍的に使用できます。戻り値の型のないコンストラクターや追加の引数を禁止する演算子など、さまざまなコンテキストに適用されます。 std::enable_if の条件付き動作の背後にある鍵である SFINAE はテンプレートにのみ適用でき、このアプローチの普遍性をさらにサポートします。

戻り値の型での std::enable_if の回避:

戻り値の型で std::enable_if を使用する場合、問題は関数のシグネチャではなく、テンプレートの特殊化です。マイヤーズ氏は、明確さと一貫性の理由から、この慣行には反対するようアドバイスしています。 Enable_if で戻り値の型を指定すると、テンプレート定義と基本テンプレートの間に不整合が生じます:

<code class="cpp">template<typename T>
struct Check4
{
    typename std::enable_if<std::is_same<T, int>::value, int>::type read() {
        return 42;
    }

    int read() {    // error: redeclared without 'typename'
        return 3.14;  // never used
    }   
};</code>

メンバー関数テンプレートと非メンバー関数テンプレート:

説明した懸念事項と推奨事項メンバー関数テンプレートと非メンバー関数テンプレートの両方に適用されます。アプローチに目立った違いはありません。

以上が関数の戻り値の型で `std::enable_if` の使用を避けるべき理由は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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