知名营销类网站,seo网络优化公司排名,自己做网站卖产品怎么样,为知笔记如何导入wordpressstd::optionalT是 C17 中的一个标准库组件#xff0c;optional T对象默认是空的#xff0c;也就是处于无效状态#xff0c;给它赋值后因为里面有了元素#xff0c;就变成了有效状态。
1.引入背景 c函数常用返回值表示函数是否执行成功。如返回nullptr表示… std::optionalT是 C17 中的一个标准库组件optional T对象默认是空的也就是处于无效状态给它赋值后因为里面有了元素就变成了有效状态。
1.引入背景 c函数常用返回值表示函数是否执行成功。如返回nullptr表示执行失败反之则执行成功。或者返回-1表示执行失败0表示执行成功。此时如果函数在执行成功时还需要传出执行结果则只能使用函数的传出参数。 我们需要有一种简单的概念它能够将执行是否成功的标记与执行结果统一起来这就是模板类 optional。
2.创建对象 std::optionalT 包含一个值时它的行为就像一个普通的容器可以访问和修改这个值。当它为空时任何试图访问值的操作都会失败通常是通过抛出一个异常或返回一个错误值。 下面例子中初始化optionalint对象后使用函数 has_value()检查是否包含值使用函数value() 访问包含的值。
#include iostream
#include optional
using namespace std;
int main()
{optionalint op1; // 默认是无效值if (op1.has_value()){ cout op1 value op1.value() endl;} optionalint op2 10; // 赋值持有有效值 if (op2.has_value()){ cout op2 value op2.value() endl;}
} 运行结果:
op2 value 10 optional也能够转换为 bool 值可以用 */- 来直接访问内部的值行为表现很像指针。
#include iostream
#include string
#include optional
using namespace std;
int main()
{optionalstring op {c shell}; if (op) //可以转为bool值{ cout op value *op endl; // 使用*/-访问内部的值}
} 运行结果:
op value c shell 3.工厂函数 optional 也可以用工厂函数 make_optional() 来创建不过与直接构造不同即使不提供初始化参数它也必定会用“零值”创建出一个有效值的 optional 对象这一点我们在用的时候要特别注意。
#include iostream
#include vector
#include optional
using namespace std;
int main()
{auto op1 make_optionalint(); // 使用默认值构造有效值if (op1.has_value()) { cout op1 value op1.value() endl; } auto op2 make_optionalstd::vectordouble(); // 使用默认值构造有效值if (op2.has_value()) { cout op2 size op2-size() endl; } } 运行结果
op1 value 0
op2 size 0
4.应用示例 实现一个求平方根的函数。
#include iostream
#include optional
using namespace std;optionaldouble safesqrt(double x)
{optionaldouble v; if (x 0) { return v; }v ::sqrt(x); return v;
}int main()
{optionaldouble v1 safesqrt(-1);if (v1.has_value()) { cout v1 value v1.value() endl; } optionaldouble v2 safesqrt(3);if (v2.has_value()) { cout v2 size v2.value() endl; }
};
运行结果
v2 size 1.73205