等价于c++11中的python-walrus运算符(:=)



最近我在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()返回空指针,则ifobject求值为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
}

最新更新