我想使用一个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”构建时,编译器无法找出要使用的正确构造函数。
在这样的结构中使用和添加对的正确方法是什么?
1条答案
按热度按时间14ifxucb1#
这个问题不是插入的问题,而是
operator[]
的使用问题。当map中找不到key时,这个操作符会创建默认初始化的对象,并且你的std::variant
没有默认构造函数 *。变化
字符串
到
型
这两个初始化都可以工作:
型
A
没有默认构造方法,所以std::variant
将不能被默认构造。