c++11 中 python 海象运算符 (:=) 的等价物?
Equivalent of python walrus operator (:=) in c++11?
最近我一直在 python 中使用 :=
运算符,以这种方式:
if my_object := SomeClass.function_that_returns_object():
# do something with this object if it exists
print(my_object.some_attribute)
问题
有没有办法在不使用 stdlib
的情况下在 c++11 中执行此操作?
例如在 arduino 草图中,如果我想使用可能 return 为零的方法,例如:
if(char * data = myFile.readBytes(data, dataLen))
{
// do something
}
else
{
// do something else
}
Python 的 :=
赋值表达式运算符(又名“海象”运算符)returns 赋值的 value。
C++ 的 =
赋值运算符(均为 copy assignment and move assignment, as well as other assignment operators)本质上做同样的事情,但方式不同。赋值的结果是对被赋值对象的 引用,允许在进一步的表达式中计算该对象。
所以,相当于:
if my_object := SomeClass.function_that_returns_object():
# do something with this object if it exists
print(my_object.some_attribute)
就像你展示的那样:
SomeType *object;
if ((my_object = SomeClass.function_that_returns_object())) {
// do something with this object if it exists
print(my_object->some_attribute);
}
如果 function_that_returns_object()
returns 是空指针,则 if
计算 object
为假,否则计算为真。其他类型也可以这样做,例如:
int value;
if ((value = SomeClass.function_that_returns_int()) == 12345) {
// do something with this value if it matches
}
根据文档,readBytes returns 缓冲区中的字节数(不是指针),所以我认为您只需要执行以下操作:
if(myFile.readBytes(data, dataLen))
{
// do something with data
}
else
{
// do something else
}
不完全是,不。
正如其他答案中提到的,c++ =
运算符已经完成了大部分您想要的操作。如果有一个现有变量,那么对该变量的赋值 return 是对它的引用,因此您可以将其放入 if
条件中:
Foo* a_pointer;
if (a_pointer = some_function()) {
//...
}
在这里,如果 some_function
return 一个非空指针并且 a_pointer
将是指针的副本 returned,则 if 条件的主体将执行通过 some_function
.
不过,与海象运算符不同的是,这有一个限制,即 a_pointer
必须首先在 if
条件之外定义。
C++17 增加了一些更接近的东西,因为您可以使用特殊的 if
-initializer 语法在 if
条件内初始化变量:
if (Foo* a_pointer = some_function(); a_pointer) {
//...
}
请注意,初始化程序仍然不会直接影响 if
条件的真实性。只有 ;
之后的表达式决定 if
语句的主体是否会执行。在这种情况下,a_pointer
被初始化为 return 在初始化程序中由 some_function
编辑的值,然后条件部分检查 a_pointer
是否为真。
最近我一直在 python 中使用 :=
运算符,以这种方式:
if my_object := SomeClass.function_that_returns_object():
# do something with this object if it exists
print(my_object.some_attribute)
问题
有没有办法在不使用 stdlib
的情况下在 c++11 中执行此操作?
例如在 arduino 草图中,如果我想使用可能 return 为零的方法,例如:
if(char * data = myFile.readBytes(data, dataLen))
{
// do something
}
else
{
// do something else
}
Python 的 :=
赋值表达式运算符(又名“海象”运算符)returns 赋值的 value。
C++ 的 =
赋值运算符(均为 copy assignment and move assignment, as well as other assignment operators)本质上做同样的事情,但方式不同。赋值的结果是对被赋值对象的 引用,允许在进一步的表达式中计算该对象。
所以,相当于:
if my_object := SomeClass.function_that_returns_object():
# do something with this object if it exists
print(my_object.some_attribute)
就像你展示的那样:
SomeType *object;
if ((my_object = SomeClass.function_that_returns_object())) {
// do something with this object if it exists
print(my_object->some_attribute);
}
如果 function_that_returns_object()
returns 是空指针,则 if
计算 object
为假,否则计算为真。其他类型也可以这样做,例如:
int value;
if ((value = SomeClass.function_that_returns_int()) == 12345) {
// do something with this value if it matches
}
根据文档,readBytes returns 缓冲区中的字节数(不是指针),所以我认为您只需要执行以下操作:
if(myFile.readBytes(data, dataLen))
{
// do something with data
}
else
{
// do something else
}
不完全是,不。
正如其他答案中提到的,c++ =
运算符已经完成了大部分您想要的操作。如果有一个现有变量,那么对该变量的赋值 return 是对它的引用,因此您可以将其放入 if
条件中:
Foo* a_pointer;
if (a_pointer = some_function()) {
//...
}
在这里,如果 some_function
return 一个非空指针并且 a_pointer
将是指针的副本 returned,则 if 条件的主体将执行通过 some_function
.
不过,与海象运算符不同的是,这有一个限制,即 a_pointer
必须首先在 if
条件之外定义。
C++17 增加了一些更接近的东西,因为您可以使用特殊的 if
-initializer 语法在 if
条件内初始化变量:
if (Foo* a_pointer = some_function(); a_pointer) {
//...
}
请注意,初始化程序仍然不会直接影响 if
条件的真实性。只有 ;
之后的表达式决定 if
语句的主体是否会执行。在这种情况下,a_pointer
被初始化为 return 在初始化程序中由 some_function
编辑的值,然后条件部分检查 a_pointer
是否为真。