switch case 字符串表达式支持


根据业务需求,在编码过程中,经常会遇到switch case表达式是字符串的场景,现支持如下。

【1】实现文件

支持实现的文件

 1 #pragma once
 2 
 3 #include <cstddef>
 4 #include <cstdint>
 5 #include <type_traits>
 6 
 7 namespace prefab  8 {  9     template<typename T>
10     struct fnv1a_constant; 11 
12     template<>
13     struct fnv1a_constant<std::uint32_t>
14  { 15         static constexpr std::uint32_t prime = 16777619; 16         static constexpr std::uint32_t offset = 2166136261; 17  }; 18 
19     template<>
20     struct fnv1a_constant<std::uint64_t>
21  { 22         static constexpr std::uint64_t prime = 1099511628211ull; 23         static constexpr std::uint64_t offset = 14695981039346656037ull; 24  }; 25 
26     template<typename T, typename TChar>
27     inline constexpr T fnv1a_hash(const TChar* const str, const T result = fnv1a_constant<T>::offset) 28  { 29         return (str[0] == '\0') ? result : 30             fnv1a_hash(str + 1, 31             static_cast<T>( 32                 (result ^ *str)* 
33                 static_cast<unsigned long long>(fnv1a_constant<T>::prime))); 34  } 35 
36     template<typename T, typename TChar>
37     inline constexpr T fnv1a_hash(std::size_t n, const TChar* const str, const T result = fnv1a_constant<T>::offset) 38  { 39         return n > 0 ? fnv1a_hash(n - 1, str + 1, (result ^ *str) * fnv1a_constant<T>::prime) : result; 40  } 41 
42     template<typename T, typename TChar, std::size_t N>
43     inline constexpr T fnv1a_hash(const TChar(&str)[N]) 44  { 45         return fnv1a_hash<T>(N - 1, &str[0]); 46  } 47 
48     template<typename TChar,std::size_t N>
49     inline constexpr auto hash(const TChar(&str)[N]) 50  { 51         return fnv1a_hash<std::size_t, TChar, N>(str); 52  } 53 
54     template<typename T>
55     inline constexpr auto hash(T const& str) 56  { 57         return fnv1a_hash(str.size(), str.data(), fnv1a_constant<std::size_t>::offset); 58  } 59 }

【2】应用示例

 1 #include "hash.hpp"
 2 
 3 #include <string>
 4 #include <iostream>
 5 
 6 void print(int index, std::string value)  7 {  8     std::cout << index << " :: " << value << std::endl;  9 } 10 
11 int main() 12 { 13     int index = 0; 14     for (std::string type : { "abc", "kaizen", "2805", "x64", "XIAN" }) 15  { 16         switch (prefab::hash(type)) 17  { 18         case prefab::hash("abc"): 19             print(index++, type); 20             break; 21         case prefab::hash("kaizen"): 22             print(index++, type); 23             break; 24         case prefab::hash("2805"): 25             print(index++, type); 26             break; 27         case prefab::hash("x64"): 28             print(index++, type); 29             break; 30         case prefab::hash("beijing"): 31             print(index++, type); 32             break; 33         default: 34             break; 35  } 36  } 37 
38     return 0; 39 } 40 
41 // result:
42 /*
43 0 :: abc 44 1 :: kaizen 45 2 :: 2805 46 3 :: x64 47 */

 

good good study, day day up.

顺序 选择 循环 总结


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM