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 是否为真。