【问题标题】:"Python dictionary" functionality in C++?C++ 中的“Python 字典”功能?
【发布时间】:2015-08-17 22:01:41
【问题描述】:

在 Python 中,可以定义像这样的字典

a = {
    'a': 'hhh',
    'b': 123,
    'jfa': {'j': 1.5, 'r': 'string'}
    }

在 C++11 中,我看到你可以

std::map<std::string, int> a = {
  {"a", 1},
  {"hh", 4}
};

但我真的希望值的类型不同(特别是允许字典作为值)。是否有允许这样做的成语或库?下一个标准有什么计划吗?

【问题讨论】:

  • 使用boost::anyboost::variant或类似的?
  • 在最后一部分,GCC 支持来自 Library Fundamentals TS 的std::experimental::any。 IIRC,variant 是 LF2 TS 的一部分,或者可能还没有。特别是关于设计决策的讨论很多。
  • 如果您的预期值类型可以表示为一些通用(可能是抽象)基类的合理子类,那么您可以使用指向实例的智能指针。否则,您将不得不像boost::anyboost::variant 那样使用一些运行时类型检查,并且这种设计气味很强烈,可能会杀死您。或者严重伤害你。您已被警告 (TM)。
  • 我相信 boost::variant 的重点是某些操作可以在编译时进行类型检查。见boost::apply_visitor。不过我从来没用过。
  • @Cheersandhth.-Alf 完全同意。我多次看到,几乎所有此类情况都可以以更好的方式(在性能方面)得到解决。至于问题本身:C++ 是强类型的静态类型语言,而 Python 是动态类型的(实际上 - 几乎是无类型的)。我有点害怕,越来越多的人认为每种语言都应该具有相同的功能集。这不可能。诸如“这是我的 Ruby/Python 代码。如何将其转换为 C/C++?”之类的问题。或“是否可以像在 Java 中那样在 C++ 中做 X?”没有任何意义。

标签: c++ c++11 dictionary


【解决方案1】:

目前有boost::variant(允许特定类型集适合对象)或boost::any,允许任何类型适合对象。据我所知,它们都被考虑添加到标准库中,但我更确定any

【讨论】:

    【解决方案2】:

    您可以考虑 Niels Lohmann 的优秀 JSON for C++ 库。单一标头,许可许可,使 JSON 成为一流的类型。

    链接:https://github.com/nlohmann/json

    例子:

    nlohmann::json myDict = {
      {"a", 1},
      {"hh", 4}
    }
    

    【讨论】:

    • 这是一个有趣的想法,尽管它感觉像是对 JSON 库的轻微滥用。
    猜你喜欢
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    • 2018-12-31
    • 2022-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    相关资源
    最近更新 更多