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 &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(); } }
这个模板提供了一个简洁且实现非整数 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中文网其他相关文章!