C ++如何在编译时检查变体映射的类型

时间:2018-02-24 14:40:13

标签: c++ template-meta-programming variant

我想要一张关键值对的地图;密钥可以实现为字符串或枚举类;但是这些值需要支持多种类型,例如intbool

现在,我想要一个具有以下签名的函数

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);

1 个答案:

答案 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涉及堆分配。