基于键的数据类型选择对应映射表的通用实现方案
通用键值提取实现方案
核心思路
利用C++20的模板特化机制,将每个键类型与对应的映射表绑定,从而实现无需重载就能自动匹配映射表的通用提取函数。
方案一:全局模板变量绑定类型与映射表
先声明一个模板变量,再为每个键类型特化出对应的映射表引用,最后基于这个模板变量实现通用提取函数:
#include <map> #include <string> enum class Colors {RED, GREEN}; enum class Days {MON, SUN}; std::map<Colors, std::string> map1{ {Colors::RED, "red"}, {Colors::GREEN, "green"}, }; std::map<Days, std::string> map2{ {Days::MON, "mon"}, {Days::SUN, "sun"}, }; // 声明模板变量,用于关联类型与映射表 template<typename T> inline std::map<T, std::string>& g_key_map; // 为每个键类型特化,绑定对应的映射表 template<> inline std::map<Colors, std::string>& g_key_map<Colors> = map1; template<> inline std::map<Days, std::string>& g_key_map<Days> = map2; // 通用提取函数 template<typename T> std::string extractValue(T k) { // 使用at()会在键不存在时抛出std::out_of_range,也可改用find()处理无匹配的情况 return g_key_map<T>.at(k); }
调用示例:
int main() { auto red_str = extractValue(Colors::RED); // 得到"red" auto mon_str = extractValue(Days::MON); // 得到"mon" return 0; }
方案二:类模板特化封装映射表获取
如果不想使用全局变量,可以用类模板特化来封装映射表的获取逻辑:
#include <map> #include <string> enum class Colors {RED, GREEN}; enum class Days {MON, SUN}; std::map<Colors, std::string> map1{ {Colors::RED, "red"}, {Colors::GREEN, "green"}, }; std::map<Days, std::string> map2{ {Days::MON, "mon"}, {Days::SUN, "sun"}, }; // 声明基类模板 template<typename T> struct KeyMapProvider; // 为每个键类型特化Provider template<> struct KeyMapProvider<Colors> { static std::map<Colors, std::string>& get_map() { return map1; } }; template<> struct KeyMapProvider<Days> { static std::map<Days, std::string>& get_map() { return map2; } }; // 通用提取函数 template<typename T> std::string extractValue(T k) { return KeyMapProvider<T>::get_map().at(k); }
优化:处理键不存在的场景
如果需要避免异常,可以改用find()并返回默认值:
template<typename T> std::string extractValue(T k, const std::string& default_val = "") { auto& target_map = g_key_map<T>; auto it = target_map.find(k); return it != target_map.end() ? it->second : default_val; }
对比重载方案的优势
重载虽然可行,但需要为每个键类型单独编写函数;而模板方案仅需为每个类型添加一次特化绑定,后续新增类型时只需补充对应的特化代码,复用性更强,更符合你想要的通用实现需求。
内容的提问来源于stack exchange,提问作者aydwi
相关产品推荐
相关产品推荐

