ホームページ >バックエンド開発 >C++ >C/C で非整数値を含む switch ステートメントを実装するにはどうすればよいですか?

C/C で非整数値を含む switch ステートメントを実装するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-30 06:28:11757ブラウズ

How Can I Implement Switch Statements with Non-Integer Values in C/C  ?

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 &amp;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())&amp;&amp;(!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 サイトの他の関連記事を参照してください。

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