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.
顺序 选择 循环 总结
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异