非 POD (Plain Old Data) 定数を使用する場合、異なるコード パスの間で選択する必要があります。定数の値に基づきます。ただし、従来の switch ステートメントは整数値のみを受け入れます。これは、非整数定数の選択に課題をもたらします。
従来のアプローチ: ネストされた if ステートメント
これを処理する簡単な方法は、一連のネストされた if を使用することです。次のようなステートメント:
if( str == "foo" ) ... else if( str == "bar" ) ... else ...
これは簡単ですが、数が多いと面倒で非効率になる可能性があります。 「n」はケースの数です。
高度なテクニック
効率を高めるために、より高度なテクニックを使用すると、雇用される。 1 つのアプローチでは、マップなどのデータ構造を使用して文字列を整数として表現し、その後標準の switch ステートメントを使用します。ただし、これによりコーディングがさらに複雑になります。
コンパイル時のマジック: マクロとテンプレートのマジック
独自のアプローチは、マクロとテンプレートのマジックを使用してアンロールされたバイナリを生成することです。コンパイル時に検索します。 fastmatch.h のようなライブラリは、大文字と小文字の一致を定義するための明確な構文を提供できます。
NEWMATCH MATCH("asd") some c++ code MATCH("bqr") ... the buffer for the match is in _buf MATCH("zzz") ... user.YOURSTUFF /*ELSE optional */ ENDMATCH(xy_match)
これにより、簡単に呼び出すことができる xy_match(char *&_buf, T &user) のような関数が生成されます。
C 11 アップデート: ラムダとイニシャライザList
C 11 では、ラムダと初期化子リストがよりクリーンなソリューションを提供します。
Switch("ger", { {"asdf", []{ printf("0\n"); }}, {"bde", []{ printf("1\n"); }}, {"ger", []{ printf("2\n"); }} }, [](const char *a, const char *b) { return strcmp(a, b) < 0; });
このアプローチでは、大文字と小文字の一致のソートされたリストで二分検索を利用し、効率的な O( log n) の複雑さ。
コンパイル時間Trie
さらなる進歩として、コンパイル時の Try を活用して、ソートされていないケース分岐を処理できます。このアプローチでは、高度な C11 メタプログラミングを使用して、コンパイル時に検索トライを生成します。各 trie ノードには、コード生成を最適化するための switch ステートメントが含まれています。
実装は、GitHub の smilethax/cttrie にあります。
以上がC/C Switch ステートメントで非整数定数を効率的に処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。