C/C : 非整数値の Switch ステートメント
switch ステートメントでは、多くの場合、非整数値に基づいてアクションを実行する必要があります。整数値。残念ながら、C/C では、switch ステートメントは整数式でのみ使用できます。
単純なアプローチ
非整数 switch ステートメントを処理するための簡単な解決策は、次のとおりです。一連の if-else ステートメントを使用します:
if (str == "foo") { ... } else if (str == "bar") { ... } else { ... }
ただし、このアプローチは冗長で非効率です(O(n)、n はケースの数) であり、switch ステートメントの優雅さが欠けています。
マクロとテンプレートのトリック
マクロとテンプレートの使用、コンパイル時に二分検索を実装できます:
#define 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 が生成されます。二分探索を自動的に実行し、それぞれの場合に適切なコードを呼び出します。このアプローチは効率的 (O(log n)) ですが、標準の switch ステートメントほど単純ではありません。
C 11 の機能強化
C 11 ではラムダと初期化子リスト。これにより、非整数 switch ステートメントの明確さが大幅に向上します。
template <typename KeyType, typename FunPtrType, typename Comp> void Switch(const KeyType &value,std::initializer_list<std::pair<const KeyType,FunPtrType>> sws,Comp comp) { auto r=std::lower_bound(sws.begin(),sws.end(),val,cmp); if ( (r!=sws.end())&&(!cmp(val,*r)) ) { r->second(); } }
Thisテンプレートは、非整数 switch ステートメントを実装するための簡潔で効率的な方法を提供します。
コンパイル時トライ
より最近の進歩には、コンパイル時に検索トライを生成するメタプログラミングの利用が含まれます。時間。このアプローチは、ソートされていない非整数 switch ステートメントを処理し、コンパイラのコード ジェネレーターを使用して効率的なコードを生成します。
Switch<const char *,void (*)()>("ger",{ // sorted: {"asdf",[]{ printf("0\n"); }}, {"bde",[]{ printf("1\n"); }}, {"ger",[]{ printf("2\n"); }} },[](const char *a,const char *b){ return strcmp(a,b)<0;});
このアプローチにより、C/C での非整数 switch ステートメントの効率と可読性がさらに向上します。
以上がC/C で非整数値を含む switch ステートメントを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。