【问题标题】:Is there a way to store auto value in c++ map? [duplicate]有没有办法在 C++ 地图中存储自动值? [复制]
【发布时间】:2021-10-22 15:00:36
【问题描述】:

嘿,我是 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); 

感谢您的帮助!

【问题讨论】:

  • 也许std::any 能帮到你?
  • “存储任何类型的某种类” 这些类已经存在:std::variantstd::any。第一个接口更合理,但需要提前知道所有可能的类型。
  • 也许std::map 不是解决您的问题的正确容器,不管它是什么?
  • std::variant 如果您限制自己支持的类型数量(如在 json 库中)。

标签: c++ dictionary


【解决方案1】:

auto 关键字并不意味着您可以将多个值类型分配给同一个存储,它只是 C++ 中的一个自动类型推断工具,当您处理复杂类型名称或纯粹不可写的类型(例如捕获 lamdas)时很有用例如:

void foo()
{
    bool b = true;
    auto l = [&]() -> bool { return !b; };
}

如果您想在同一存储空间中存储不同(或任何)类型的值,请尝试使用 std::varianstd::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
}

【讨论】:

  • 它不起作用:/ 我尝试使用 c++17 但不幸的是它仍然不起作用,g++ 编译器无法识别此关键字
  • @absolutapicem std::variant 不是关键字。你需要#include &lt;variant&gt;
  • @FrançoisAndrieux d'accord merci
猜你喜欢
  • 1970-01-01
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
  • 2017-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多