ホームページ >バックエンド開発 >C++ >C の「constexpr if-else」チェーンで「else」節が実行されないようにするにはどうすればよいですか?

C の「constexpr if-else」チェーンで「else」節が実行されないようにするにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-27 11:10:09721ブラウズ

How Can I Ensure No `else` Clause is Ever Executed in a C   `constexpr if-else` Chain?

Constexpr If-Else 節の不履行の防止

C では、すべての constexpr if 条件をアサートする必要がある場合があります。 if-else ステートメントが満たされる。このようなアサーションがないと、else 節が予期せず取られる可能性があります。

次のコードを考えてみましょう。

if constexpr(condition1){
    ...
} else if constexpr (condition2) {
   ....
} else if constexpr (condition3) {
  ....
} else {
    // I want the else clause never taken. But I heard the code below is not allowed
    static_assert(false);
}

すべての条件が相互に一致する必要があるため、else 節は決して取られないと考えるかもしれません。エクスクルーシブ。ただし、C 標準によれば、そのようなアサーションは許可されていません。

解決策: テンプレートの依存関係

else 句が使用されないようにするには、テンプレートパラメータに応じて破棄されるステートメント。これは、次のコードを使用して実現できます。

template <class... T> constexpr std::false_type always_false{};

if constexpr(condition1){
    ...
} else if constexpr (condition2) {
   ....
} else if constexpr (condition3) {
  ....
} else {       
    static_assert(always_false<T>);
}

Reasoning

C 標準では、有効な特殊化を生成できない場合、プログラムは不正形式であると規定されています。テンプレートまたはテンプレート内のサブステートメント。破棄されるステートメントをテンプレート パラメーターに依存させることで、コンパイラーは、どの条件も満たされない場合には有効な特殊化が生成されないようにすることができ、事実上、else 節の取得を防ぐことができます。

以上がC の「constexpr if-else」チェーンで「else」節が実行されないようにするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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