C++标准中的switch
是不能够实现字符串的case匹配的,但是往往我们也有这个需求,来实现一下。
我们需要实现的结果如下:
1 | switch("123"){ |
直接匹配字符串是不行的,C++中case只可以匹配a constant expression of the same type as the type of condition after conversions and integral promotions
,所以在这里我需要把字符串转换为一个字面值整数从而进行case匹配。
将字符串转换为数字可以使用HASH(Wikipedia - hash function)方式来计算,在这里我使用的Hash算法是Chromium中计算string字符串hash值的算法(Chromium - string_piece.h)。
Hash计算部分代码如下:
1 | // Hashing --------------------------------------------------------------------- |
我们需要用到的也就是HASH_STRING_PIECE
这个宏定义代码。
在C++11特性中,我们可以使用constexpr
(具体内容参照文章末尾链接)来定义一个constexpr函数,switch的case标签处调用这个constexpr函数。
这里我写了一个递归来实现上面的hash计算算法:
1 | constexpr size_t HASH_STRING_PIECE(const char *string_piece,size_t hashNum=0){ |
此时在switch中就可以这么写:
1 | switch(HASH_STRING_PIECE("123")){ |
为了更方便我们可以重载一个""
操作符来方便我们使用,而不是每次都直接调用HASH_STRING_PIECE
这个函数,也是为了更符合case的使用规范。
1 | constexpr size_t operator "" _HASH(const char *string_pice,size_t){ |
然后就可以这么用了:
1 | switch(HASH_STRING_PIECE("123")){ |
直接使用标准库string调用的话可以再写这么一个函数:
1 | size_t CALC_STRING_HASH(const string& str){ |
然后直接传入string对象的话可以调用CALC_STRING_HASH
函数:
1 | int main(int argc,char* argv[]) |