std::optional 是如何工作的?
how does std::optional work under the hood?
我刚刚了解了 c++ 17 中的 std::optional 功能以及其他一些非常有用的功能...
但是关于std::optional有几件事我不明白,我希望有人向我解释一下:
首先,据我所知,在 std::optional 中,return 值可以是指定的类型,也可以不是这样的:
std::optional<std::string> getName()
{
if(person.hasName())
{
return person.name;
}
else
{
return {};
}
}
return{} return怎么什么都没有?例如,如果我要制作一个类似 class 的 return 指定值或什么都没有,我如何制作自己的 class 以便 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 ???
{
...
}
}
我真的很困惑,变量名 return 怎么可能是布尔值?不像对象的构造函数可以 return 任何东西,所以这怎么可能?
再说一次,我想制作我自己的 class,有点类似于 std::optional 我如何制作它,以便我的 class 的一个实例可以用作布尔值?
我真的很感激能够解决我的问题的答案,而不是与何时使用 std::optional 或为什么我不应该自己制作做同样事情的 class 等相关的东西......
谢谢!
return {};
将简单地调用 class 的默认构造函数。
通过给 class 一个 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;
}
非常简化,缺少赋值运算符等。
how do I make my own class so return {} is valid ?
通过使 class 默认可构造。具体怎么做取决于 class。在 class 是隐式默认构造函数的情况下,您无需执行任何操作,而在其他情况下,您可能需要显式声明构造函数。例如:ClassName() = default;
.
how could a variable name return a boolean
想想这个变量名 "returns a boolean":
int x = 42;
if (x)
;
或者这个变量名怎么取“returns一个std::string_view”:
const char* str = "example";
std::string__view sv = str;
这称为从一种类型到另一种类型的转换。这就是 if(name)
.
中发生的事情
how do I make it so an instance of my class can be used as a boolean ?
通过提供转换运算符。
我刚刚了解了 c++ 17 中的 std::optional 功能以及其他一些非常有用的功能...
但是关于std::optional有几件事我不明白,我希望有人向我解释一下:
首先,据我所知,在 std::optional 中,return 值可以是指定的类型,也可以不是这样的:
std::optional<std::string> getName()
{
if(person.hasName())
{
return person.name;
}
else
{
return {};
}
}
return{} return怎么什么都没有?例如,如果我要制作一个类似 class 的 return 指定值或什么都没有,我如何制作自己的 class 以便 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 ???
{
...
}
}
我真的很困惑,变量名 return 怎么可能是布尔值?不像对象的构造函数可以 return 任何东西,所以这怎么可能?
再说一次,我想制作我自己的 class,有点类似于 std::optional 我如何制作它,以便我的 class 的一个实例可以用作布尔值?
我真的很感激能够解决我的问题的答案,而不是与何时使用 std::optional 或为什么我不应该自己制作做同样事情的 class 等相关的东西......
谢谢!
return {};
将简单地调用 class 的默认构造函数。
通过给 class 一个 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;
}
非常简化,缺少赋值运算符等。
how do I make my own class so return {} is valid ?
通过使 class 默认可构造。具体怎么做取决于 class。在 class 是隐式默认构造函数的情况下,您无需执行任何操作,而在其他情况下,您可能需要显式声明构造函数。例如:ClassName() = default;
.
how could a variable name return a boolean
想想这个变量名 "returns a boolean":
int x = 42;
if (x)
;
或者这个变量名怎么取“returns一个std::string_view”:
const char* str = "example";
std::string__view sv = str;
这称为从一种类型到另一种类型的转换。这就是 if(name)
.
how do I make it so an instance of my class can be used as a boolean ?
通过提供转换运算符。