将多种类型存储为C ++词典中的值?

用户名

我想编写一个行为几乎等同于Python字典的C ++对象。C ++std::mapstd::unordered_map提供了Python词典已经具备的某些功能,但是缺少最重要的功能之一,即能够添加任意对象和类型。即使不可能,您离Python字典的功能还有多近?

先前的一些问题(此处此处)无法解决将多个类型添加到字典的问题。

例如,我希望能够在C ++中执行以下操作:

my_dict = {'first': 1,
           'second': "string",
           'third': 3.5,
           'fourth': my_object}
my_dict['fifth'] = list([1, 2, 3])

我能想到的最佳解决方案将是使用void指向要重新解释的数据的指针,或者是某种类型限制的运行时多态?

阿西科尔斯基

我能想到的最佳解决方案将是使用对要重新解释的数据的空指针,还是某种类型限制的运行时多态?

在我看来,现代C ++中的许多无效指针和许多指针重新解释应该表明设计不好。我相信多态性将是一种方法。

另外,如果您要使用固定数量的类型,请考虑使用C ++ 17的std :: anystd :: variant,这是更现代的union

#include <iostream>
#include <map>
#include <string>
#include <variant>

typedef std::map<std::variant<int, std::string>, std::variant<int, std::string>> Dict;

int main(){
    Dict d;
    d["key"] = 1;
    d[5] = "woah";
    std::cout << std::get<int>(d["key"]) << std::endl; // prints 1

    // edit: print all the keys in d
    for(auto& k_v: d){
        std::visit(
            [](auto& value){std::cout << value << ' ';},
            k_v.first // k_v.second to print all values in d
        );
    }

}

上面的示例在某些用例中可能很有用。

还请检查如何在任何C ++ json库中实现json对象。这可能会有所帮助。

编辑:我添加了一个示例,std::visit示例遍历字典中的键。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章