【问题标题】:C++ How to check the type of a variant map at compile timeC ++如何在编译时检查变体映射的类型
【发布时间】:2018-02-24 14:40:12
【问题描述】:

我想要一个键值对的映射;键可以实现为字符串或枚举类;但值需要支持多种类型,例如intbool

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

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

鉴于映射是常量,是否可以让函数在编译时检查类型?

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

应该有编译错误

bool can_abort;
getOption("start_time", can_abort);

【问题讨论】:

  • 看起来你可以使用 tuple 和项目索引作为键。
  • 你能提供一些有用的示例代码吗?以及您遇到问题的minimal reproducible example

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


【解决方案1】:

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

struct options_t {
    int start_time;
    bool can_abort;
};

如果您真的必须迭代不同类型的元素,您可以完全使用 voodoo 并使用 Louis Dionne 的 Boost.Hana 库。它有一个multi-type map class。一切都会在编译时检查。

或者,如果您想要更多面向运行时的行为,并且想要灵活性 w.r.t.您在地图中粘贴的类型,您可以使用类型擦除并使其成为std::unordered_map&lt;std::string, std::any&gt;std::any 类型可以保存任何类型的值。但是您可以知道尝试从中提取哪种类型(如果您错了,则会出现异常)-即您不会进行编译时检查。

至于使用变体 - 你可以使用它们,但如果你的键是 std::strings,那么在编译时不会检查任何内容,因为 std::strings 涉及堆分配。

【讨论】:

  • @SombreroChicken:你是greatly misinformed,我的朋友......为此感谢Antony Polukhin。
  • 这会带走任何幽默的机会。这就像在解释这个笑话。
猜你喜欢
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 2011-02-06
  • 1970-01-01
  • 2011-12-06
  • 2012-06-10
  • 1970-01-01
相关资源
最近更新 更多