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