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

use*_*738 5 c++ python

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

之前的一些问题(此处此处)无法处理向字典添加多种类型的问题。

例如,我希望能够在 C++ 中做这样的事情:

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

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

asi*_*ski 7

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

在我看来,现代 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
        );
    }

}
Run Code Online (Sandbox Code Playgroud)

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

还要查看 json 对象是如何在任何 C++ json 库中实现的。它可能会有所帮助。

编辑:我添加了一个std::visit迭代字典中键的示例。

  • 另外,_不要这样做_。更喜欢始终知道您需要使用的值的接口。 (2认同)