boost::optional clist如何赋值

haohaoxuexi_1243 2019-01-25 04:48:12
我有一个嵌套的结构体如下:
现在我希望能给Clist赋值
比如Alist->clist =
试了好多次都不行,求大神指教

方法1:
Alist->clist {0, ""}; // 产生ERROR ,结构体不能这样子初始化?
方法2:
Alist->clist->numCa = 0; //不报错,但是我做判断if(Alist->clist)为空,我需要保护它不应该为空
方法3:
boost::optional<Alist::Clist> clist;
Clist{0,""} //ERROr, 这种initialize_list的方法貌似不适用于结构体?

求我要如何使得Alist->clist不为空,并能为clist的参数赋值

struct Alist
{
boost::optional<int> numAa;
boost::optional<string> stringAb;
struct Clist
{
boost::optional<int> numCa;
boost::optional<string> stringCb;
Clist();
~Clist();
Clist(const Clist&);
Clist& operator=(const Clist&);
CPlaneList(
const boost::optional<int>& numCa;
const boost::optional<string>& stringCb;
);
};
boost::optional<Clist> clist;
Alist();
~Alist();
Alist(const Alist&);
Alist& operator=(const Alist&);
Alist(
const boost::optional<int>& numAa;
const boost::optional<string>& stringAb;
const boost::optional<Alist::Clist>& clist
);
};


...全文
377 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
独孤过 2019-01-27
  • 打赏
  • 举报
回复
1. 结构体和类可以用初始化列表进行初始化,测试代码如下:

#include <string>
#include <iostream>

class List
{
	int num;
	std::string string;
	friend std::ostream &operator<<(std::ostream &os, const List &list)
	{
		os << list.num << ' ' << list.string;
		return os;
	}
public:
	List(const int &num, const std::string &string)
		:num(num), string(string) {}
};

int main()
{
	List list{ 0,"free" };
	std::cout << list << std::endl;
	return 0;
}
2. 由于采用boost::optional,不支持这种语法,可以使用如下初始化形式:

#include <boost/optional.hpp>
#include <string>
#include <iostream>

class List
{
	int num;
	std::string string;
	friend std::ostream &operator<<(std::ostream &os, const List &list)
	{
		os << list.num << ' ' << list.string;
		return os;
	}
public:
	List(const int &num, const std::string &string)
		:num(num), string(string) {}
};

int main()
{
	boost::optional<List> list({ 0, "free" });
	if (list.has_value() && list.is_initialized())
		std::cout << list.get() << std::endl;
	return 0;
}
3. 不过你的成员变量也采用boost::optional,变得更复杂,由于C++只支持一次隐式转换,不会连续隐式转换两次,于是不能够使用{ 0, "free" }初始化列表形式,可以使用如下初始化形式:

#include <boost/optional.hpp>
#include <boost/optional/optional_io.hpp>
#include <string>
#include <iostream>

class List
{
	boost::optional<int> num;
	boost::optional<std::string> string;
	friend std::ostream &operator<<(std::ostream &os, const List list)
	{
		os << list.num << ' ' << list.string;
		return os;
	}
public:
	List(const boost::optional<int> &num,
		const boost::optional<std::string> &string)
		:num(num), string(string) {}
};

int main()
{
	boost::optional<List> list({ 0, std::string("free") });
	std::cout << list << std::endl;
	return 0;
}
4. 也可以使用make_optional创建对象

#include <boost/optional.hpp>
#include <boost/optional/optional_io.hpp>
#include <string>
#include <iostream>

class List
{
	boost::optional<int> num;
	boost::optional<std::string> string;
	friend std::ostream &operator<<(std::ostream &os, const List list)
	{
		os << list.num << ' ' << list.string;
		return os;
	}
public:
	List(const boost::optional<int> &num,
		const boost::optional<std::string> &string)
		:num(num), string(string) {}
};

int main()
{
	boost::optional<List> list = boost::make_optional<List>({ 0, std::string("free") });
	std::cout << list << std::endl;
	return 0;
}
haohaoxuexi_1243 2019-01-26
  • 打赏
  • 举报
回复
引用 1 楼 lianshaohua 的回复:
这是整体的初始化,结构体的应该区别不大,可以试试,如果有问题再找我。
boost::optional<int> oN = boost::none;
boost::optional<int> o0 = 0;
boost::optional<int> o1 = 1;
你的答案没有任何帮助,百度一搜一大堆
ztenv 版主 2019-01-25
  • 打赏
  • 举报
回复
这是整体的初始化,结构体的应该区别不大,可以试试,如果有问题再找我。
boost::optional<int> oN = boost::none;
boost::optional<int> o0 = 0;
boost::optional<int> o1 = 1;

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧