64,682
社区成员
发帖
与我相关
我的任务
分享
#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;
}