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

C++ How to check the type of a variant map at compile time

本文关键字:映射 类型 检查 编译      更新时间:2023-10-16

我想拥有一个键,值对的地图;键可以用作字符串或枚举类实现;但是这些值需要支持多种类型,例如intbool

现在,我想具有以下签名的功能

template<typename T>
void getOption(KeyClass key_, T& value_)

鉴于地图将是恒定的,是否可以使该函数在编译时检查类型?

例如,如果地图类似于{" start_time":2," can_abort":false}

上应有汇编错误
bool can_abort;
getOption("start_time", can_abort);

如果您可以使用钥匙的枚举值,并且在编译时已知类型和值,为什么不只是一个普通的结构?

struct options_t {
    int start_time;
    bool can_abort;
};

如果您确实必须迭代不同类型的元素,则可以完整的Voodoo并使用Louis Dionne的Boost.hana库。它具有多类地图类。一切都将在编译时检查。

另外,如果您想要更多以运行时为导向的行为,并且想要灵活性W.R.T.您粘在地图中的类型,可以使用类型的擦除,然后将其制成std::unordered_map<std::string, std::any>std::any类型保存,嗯,任何类型的值;但这取决于您知道要尝试从中提取哪种类型(如果您错了,就会得到例外( - 即,您不会进行编译时间检查。

对于使用变体 - 您可以使用这些变体,但是如果您的键为std::string s,则在编译时将没有任何检查,因为std::string S涉及堆分配。