如何将键/值对添加到 cpp 中的变体映射中

问题描述 投票:0回答:1

想要使用

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

类似的最小示例

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”构建时,编译器无法找出要使用的正确构造函数。

在这种结构中使用和添加对的正确方法是什么?

c++ variant
1个回答
0
投票

问题不在于插入,而在于使用

operator[]
。当在映射中找不到键时,此运算符会创建默认初始化的对象,并且像这样的
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});
© www.soinside.com 2019 - 2024. All rights reserved.