c++ 如何在cpp中向变量Map添加键/值对

ovfsdjhp  于 2024-01-09  发布在  其他
关注(0)|答案(1)|浏览(160)

我想使用一个std::map<std::string, std::variant<A, B>> my_map,其中A和B是具有类似构造函数的类(以yaml对象作为参数),但我不知道如何实际将键/值对插入到这样的Map中。
一个类似的最小例子

  1. class A {
  2. public:
  3. A(int x): x_(x) { std::cout << "A" << std::endl;}
  4. int x_;
  5. void print() {std::cout << 2 * x_ << std::endl;}
  6. };
  7. class B {
  8. public:
  9. B (int x): x_(x) {std::cout << "B" << std::endl;}
  10. int x_;
  11. void print() {std::cout << 5* x_ << std::endl; }
  12. };
  13. int main()
  14. {
  15. using var_t = std::variant<A, B>;
  16. std::map<std::string, var_t> my_map;
  17. var_t v {std::in_place_type<A>, 3};
  18. //my_map["a"] = v; // none of these work
  19. //my_map.emplace("a", v);//
  20. my_map.insert({"a", v});
  21. std::visit([](auto&& var) { var.print();}, my_map["a"]);
  22. }

字符串
结果本

  1. usr/local/include/c++/13.1.0/tuple:2254:9: error: use of deleted function 'std::variant<_Types>::variant() [with _Types = {A, B}]'
  2. 2254 | second(std::forward<_Args2>(std::get<_Indexes2>(__tuple2))...)
  3. | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


我理解这是由于变量类型有不明确的/非默认的构造函数,所以当它试图用键“a”构建时,编译器无法找出要使用的正确构造函数。
在这样的结构中使用和添加对的正确方法是什么?

14ifxucb

14ifxucb1#

这个问题不是插入的问题,而是operator[]的使用问题。当map中找不到key时,这个操作符会创建默认初始化的对象,并且你的std::variant没有默认构造函数 *。
变化

  1. std::visit([](auto&& var) { var.print();}, my_map["a"]);

字符串

  1. std::visit([](auto&& var) { var.print();}, my_map.at("a"));


这两个初始化都可以工作:

  1. my_map.emplace("a", v);
  2. my_map.insert({"a", v});

  • Variant只有在第一个可选方法可以被默认构造时才有默认构造方法。在您的例子中,A没有默认构造方法,所以std::variant将不能被默认构造。
展开查看全部

相关问题