嘿,我是c++的新手,我正在尝试创建一个可以存储多种类型的映射:
map<sting, `auto`> test_map;
test_map["first elem"] = 1;
test_map["second elem"] = 'c';
这显然给我带来了一些错误。
我一直在网上找,我发现了一些有趣的事情,但没有答案。也许我遗漏了一点c++词汇。
我也会尝试一些类存储关于任何类型,我不知道它是否可以工作。
map<string, `my_class`> test_map;
map["first_elem"] = my_class("string");
map["first_elem"] = my_class(12);
谢谢你的帮助!
auto
关键字并不意味着您可以将多个值类型分配给相同的存储,它只是c++中的一个自动类型推断工具,在处理复杂类型名称或纯粹不可写类型(例如捕获lambda)时非常有用,例如:
void foo()
{
bool b = true;
auto l = [&]() -> bool { return !b; };
}
如果您想在相同的存储空间中存储不同(或任何)类型的值,请尝试使用std::varian
或std::any
(两者都需要c++17或更高)。
std::variant
允许您存储前面指定的中的一个类型,不做额外的分配(它的大小足以容纳指定类型的任何对象)。它是unions
的类型安全替代品。
void foo()
{
std::map<std::string, std::variant<int, float, char>> c; // this can only map int, float and char to std::string
}
std::any
可以存储任何你想要的类型,但是会在需要的时候分配。
void foo()
{
std::map<std::string, std::any> c; // this can map any type of value to std::string
}