c++switchcase使⽤string的⽅法
有时候,我们想写出下⾯这样的switch语句:
但是在c++中,是不能⽤字符串来作为case的标签的;于是,很疑惑,我们只能⽤其他的办法来实现这样的需求。
但幸运的是,c++11引⼊了constexpr和⾃定义⽂字常量,将这两个新特性结合,我们实现出看上去像上⾯这样的代码。
基本思路为:
1、定义⼀个hash函数,计算出字符串的hash值,将字符串转换为1个整数;
2、利⽤c++11⾃定义⽂字常量的语法,定义⼀个constexpr函数,switch的case标签处调⽤这个constexpr函数。如下
这个函数只有短短的⼀⾏,利⽤递归得到了与上⾯hash_函数得到的同样值,由于⽤constexpr声明了
函数,因此编译器可以在编译期得出⼀个字符串的hash 值,⽽这正是关键,既然是编译器就可以得到的整型常量,⾃然可以放到switch的case标签处了。
于是我们可以写出这样的swich语句:
这个实现中,hash_compile_time("first")是编译器计算出来的⼀个常量,因此可以⽤作case标签;⽽且如果出现了hash值冲突,编译器回给出错误提⽰。3、上⾯的语法还不够漂亮,利⽤⾃定义⽂字常量,重载⼀个operator如下:
现在我们可以写这样的⽂字常量,⽤“_hash”作为⾃定义⽂字常量的后缀,编译器看到这个后缀结尾的⽂字常量,就会去调⽤我们重载的operator,得到和调⽤hash_compile_time是⼀样的值,但看起来舒服多了:
switch case判断字符串现在,我们写出的switch语句就好看多了。
全⽂完。希望我讲清楚了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论