首页 > 后端开发 > C++ > 如何在 C/C 中实现带有非整数值的 Switch 语句?

如何在 C/C 中实现带有非整数值的 Switch 语句?

Susan Sarandon
发布: 2024-11-30 06:28:11
原创
756 人浏览过

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 引入了 lambda 和初始化列表,大大提高了非整数 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();
  }
}
登录后复制

这个模板提供了一个简洁且实现非整数 switch 语句的有效方法。

编译时 Trie

最近的进步涉及利用元编程在编译时生成搜索 trie。这种方法处理未排序的非整数 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板