c++ - std::optional 如何在幕后工作?
问题描述
我刚刚了解了 c++ 17 中的 std::optional 特性以及其他一些非常有用的特性......
但是有一些关于 std::optional 的事情我不明白,我希望有人向我解释:
首先,据我所知,在 std::optional 中,返回值可以是指定的类型,也可以是这样的:
std::optional<std::string> getName()
{
if(person.hasName())
{
return person.name;
}
else
{
return {};
}
}
return {} 如何什么都不返回?例如,如果我要创建一个返回指定值或不返回任何值的类似类,我如何创建自己的类以便 return {} 有效?我在这里误解了什么?
我的第二个问题是,当你想检查返回值时,你可以这样做:
int main()
{
std::optional<std::string> name = getName();
if(name.has_value()) // check if the name is valid using the has_value function
{
...
}
}
或者我也可以这样做:
int main()
{
std::optional<std::string> name = getName();
if(name) // check if the name is valid only using the variable name ???
{
...
}
}
我对此感到非常困惑,变量名如何返回布尔值?不像对象的构造函数可以返回任何东西,那这怎么可能呢?
再次假设我想创建自己的类,它类似于 std::optional 我如何制作它以便我的类的实例可以用作布尔值?
我真的很感激能解决我的问题的答案,而不是与何时使用 std::optional 或为什么我不应该创建自己的类来做同样的事情等相关的答案......
谢谢!
解决方案
return {};
将简单地调用类的默认构造函数。
通过给类一个转换运算符来 bool,它可以在需要时隐式转换为 bool。
它看起来像
template <typename T>
class optional {
public:
optional() {}
optional(T t) : has_value(true), value(std::move(t)) {}
operator bool() {
return has_value;
}
private:
bool has_value = false;
T value;
}
非常简化,缺少赋值运算符等等。
推荐阅读
- javascript - VueJS/Javascript:预期的数组得到了对象
- css - 如何为透明图像添加颜色
- algorithm - 骑士之旅问题 - 存储有效动作然后迭代
- reactjs - React Router如何在一个渲染周期内更新两次路由
- c# - 如何使用牛顿软从类的复杂类型属性中仅序列化特定值
- javascript - javascript Object 的问题,我总是得到 [object Object] 而不是我想要的值
- notepad++ - 多个文本替换为不同的文本
- javascript - Mixed let/const array destructuring from split string
- java - 将 WebMvcConfigurer 添加到 Spring Boot Rest 应用程序时出现内部服务器错误
- swift - SwiftUI:工作表在呈现后立即被解雇