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

ovfsdjhp  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(114)

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

class A {
    public:
        A(int x): x_(x) { std::cout << "A" << std::endl;}
        int x_;
        void print() {std::cout << 2 * x_ << std::endl;}
};

class B {
    public:
        B (int x): x_(x) {std::cout << "B" << std::endl;}
        int x_;
        void print() {std::cout << 5* x_ << std::endl; }
};

int main()
{
    using var_t = std::variant<A, B>;
    std::map<std::string, var_t> my_map;
    var_t v {std::in_place_type<A>, 3};
    //my_map["a"] = v; // none of these work
    //my_map.emplace("a", v);// 
    my_map.insert({"a", v});
    std::visit([](auto&& var) { var.print();}, my_map["a"]);
}

字符串
结果本

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


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

14ifxucb

14ifxucb1#

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

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

字符串

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


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

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

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

相关问题