C/C で非整数値をオンにする
問題:
アクションの決定非 POD 定数要素 (文字列など) に基づく場合は、ネストされたような回避策が必要ですifs は非効率的で複雑になる可能性があります。整数値用に設計された switch ステートメントは、非整数を直接サポートしません。
解決策 1: マクロとテンプレート マジック (fastmatch.h)
マクロとテンプレートの使用テンプレートを使用すると、コンパイル時に展開されたバイナリ検索を作成できます。構文は簡潔ですが、ソートされた大文字と小文字の分岐が必要です。このアプローチでは、関連する一致をバッファーに割り当てる暗黙的なブレークを含む関数が生成されます。
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("bqr",youruserdata);
解決策 2: C 11 のラムダと初期化子リスト
C 11 、ラムダおよび初期化子リストは、よりクリーンなソリューションを提供します。このアプローチでは、キーと値のペアのリストに対して二分検索が実行されます。ここで、キーは非整数値に対応し、値は関数ポインターです。次に、見つかった関数が呼び出されます。
#include <utility> #include <algorithm> #include <initializer_list> template <typename KeyType, typename FunPtrType, typename Comp> void Switch(const KeyType &value, std::initializer_list<std::pair<const KeyType, FunPtrType>> sws, Comp comp) { // ... search and invoke code } 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;});
解決策 3: コンパイル時トライ (cttrie)
C 11 では、コンパイル時トライ アプローチで未ソートを処理できます。ケースは簡単に分岐します。高度なメタプログラミング技術により、コンパイル時に検索トライが生成され、各トライ ノードで switch ステートメントを利用して実行フローを効率的にリダイレクトします。
完全な実装は、github: smileingthax/cttrie で入手できます。
以上がC/C で非整数値の switch ステートメントを効率的に実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。