我想要一张关键值对的地图;密钥可以实现为字符串或枚举类;但是这些值需要支持多种类型,例如int
或bool
现在,我想要一个具有以下签名的函数
template<typename T>
void getOption(KeyClass key_, T& value_)
鉴于映射是常量,是否可以在编译时使函数检查类型?
例如,如果地图类似{&#34; start_time&#34;:2,&#34; can_abort&#34;:false}
上应该有编译错误
bool can_abort;
getOption("start_time", can_abort);
答案 0 :(得分:0)
如果你可以为你的键使用枚举值,并且在编译时知道类型和值,为什么不只是有一个普通的结构?
struct options_t {
int start_time;
bool can_abort;
};
如果你真的必须迭代不同类型的元素,你可以完全伏都教并使用Louis Dionne的Boost.Hana库。它有一个multi-type map class。在编译时将检查所有内容。
或者,如果您想要更多面向运行时的行为,并且您需要灵活性w.r.t.你在地图中粘贴的类型,你可以使用类型擦除,然后制作一个std::unordered_map<std::string, std::any>
。 std::any
类型包含任何类型的值;但是你需要知道尝试从中提取哪种类型(如果你错了就得到例外) - 即你没有编译时检查。
至于使用变体 - 你可以使用它们,但如果你的密钥是std::string
s,那么在编译时不会检查任何内容,因为std::string
涉及堆分配。