最近我在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草图中,如果我想使用一种可能返回零的方法,例如:
if(char * data = myFile.readBytes(data, dataLen))
{
// do something
}
else
{
// do something else
}
Python的:=
赋值表达式运算符(也称为"海象"运算符)返回赋值的值。
C++的=
赋值运算符(复制赋值和移动赋值,以及其他赋值运算符)基本上做相同的事情,但方式不同。赋值的结果是对被赋值对象的引用,从而允许在进一步的表达式中对该对象进行求值。
因此,相当于:
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()
返回空指针,则if
将object
求值为false,否则求值为true。其他类型也可以这样做,例如:
int value;
if ((value = SomeClass.function_that_returns_int()) == 12345) {
// do something with this value if it matches
}
不完全是,没有。
正如其他答案中所提到的,c++=
运算符已经完成了您想要的大部分操作。如果有一个现有的变量,那么对该变量的赋值将返回对它的引用,因此您可以将其放入if
条件中:
Foo* a_pointer;
if (a_pointer = some_function()) {
//...
}
这里,如果some_function
返回非空指针,并且a_pointer
将是some_function
返回的指针的副本,则if条件的主体将执行。
然而,与walrus运算符不同的是,这有一个限制,即a_pointer
必须首先在if
条件之外定义。
C++17添加了一些更接近的内容,因为您可以使用特殊的if
初始化器语法在if
条件内初始化变量:
if (Foo* a_pointer = some_function(); a_pointer) {
//...
}
请注意,初始化器仍然不能直接促进if
条件的真实性。只有;
之后的表达式才能决定是否执行if
语句的主体。在这种情况下,a_pointer
被初始化为初始化器中some_function
返回的值,然后条件部分检查a_pointer
是否属实。
根据文档,readBytes返回放置在缓冲区(而不是指针)中的字节数,所以我认为您只需要执行以下操作:
if(myFile.readBytes(data, dataLen))
{
// do something with data
}
else
{
// do something else
}