boost::variant 中持有的类的复制构造函数的问题

Posted

技术标签:

【中文标题】boost::variant 中持有的类的复制构造函数的问题【英文标题】:Problem with the copy constructor of an class holden in boost::variant 【发布时间】:2020-06-08 16:00:27 【问题描述】:

我尝试使用 boost::variant 构建树结构,但现在遇到了一些问题。 我在 boost::variant 的类中实现了一个复制构造函数并调用了复制构造函数 就像这段代码:

#include <iostream>
#include <boost/variant.hpp>


struct Hoge
int i;
Hoge(int j) : i(j);
Hoge(Hoge const& hoge) : i(hoge.i) 
;

using var = boost::variant<int,Hoge>;

int main()

var hoge = Hoge(1);
var hogehoge = Hoge(hoge);

编译失败,因为没有匹配的函数调用“Hoge::Hoge(var&)”。

如何修复此代码?复制构造函数是否应该有参数 boost::variant? 或者我可以使用出色的增强技术修复此代码吗?

【问题讨论】:

你希望编译器如何选择一个构造函数而不是另一个?使用boost::get 明确指定您想要的类型。 【参考方案1】:

你不是在复制构造:这就像说:

var hogehoge = var(hoge); // elided assign of copy-ctor

或者确实只是

var hogehoge(hoge);
var hogehoge = hoge;

所以,你需要说你想要一个Hoge 来复制,

var hogehoge = boost::get<Hoge>(hoge); // may throw if `hoge` holds int

所以你复制构造 Hoge,然后将其 convert-construct 转换为变体类型。

Live On Coliru

#include <boost/variant.hpp>
#include <iostream>

struct Hoge 
    int i;
    Hoge(int j) : i(j);
    Hoge(Hoge const& hoge) : i(hoge.i) 
;

using var = boost::variant<int, Hoge>;

int main() 
    var hoge = Hoge(1);
    var hogehoge = boost::get<Hoge>(hoge);

【讨论】:

以上是关于boost::variant 中持有的类的复制构造函数的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在 boost::variant<T> 中存储引用而不是复制对象?

如何将项目从 boost::variant 移动到多地图?

boost::variant 和多态性

为递归变体编写 boost::variant 访问者

将由 boost::variant 聚合的类型的对象传递给接受该 boost::variant 的函数

如何返回由 boost::variant 返回类型中包含的类型的子集组成的 boost::variant