【问题标题】:Equivalent of python walrus operator (:=) in c++11?c++11中python海象运算符(:=)的等价物?
【发布时间】:2021-10-22 11:17:34
【问题描述】:

最近在python中使用:=操作符比较多,是这样的:

if my_object := SomeClass.function_that_returns_object():
    # do something with this object if it exists
    print(my_object.some_attribute)

问题

在c++11中有什么方法可以在不使用stdlib的情况下做到这一点? 例如,在 arduino 草图中,如果我想使用可能返回零的方法,例如:

if(char * data = myFile.readBytes(data, dataLen))
{
    // do something
}
else
{
    // do something else
}

【问题讨论】:

  • 这个例子有什么意义?你知道它可以编译吗?
  • 我不知道它实际上编译了,我很抱歉之前没有测试这个,这只是我睡觉的想法。

标签: python c++ c++11 arduino python-3.8


【解决方案1】:

Python 的:= 赋值表达式运算符(又名“海象”运算符)返回赋值的

C++ 的= 赋值运算符(copy assignmentmove assignment,以及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() 返回空指针,则ifobject 评估为false,否则评估为true。其他类型也可以这样做,例如:

int value;
if ((value = SomeClass.function_that_returns_int()) == 12345) {
    // do something with this value if it matches
}

【讨论】:

  • 谢谢你的回复,我的朋友;这很有意义。
【解决方案2】:

根据文档,readBytes 返回放置在缓冲区中的字节数(不是指针),所以我认为您只需要执行以下操作:

if(myFile.readBytes(data, dataLen))
{
    // do something with data
}
else
{
    // do something else
}

【讨论】:

    【解决方案3】:

    不完全是,不。

    正如其他答案中提到的,c++ = 运算符已经完成了您想要的大部分操作。如果有一个现有变量,那么对该变量的赋值会返回对它的引用,因此您可以将其放入 if 条件中:

    Foo* a_pointer;
    if (a_pointer = some_function()) {
        //...
    }
    

    这里,如果some_function返回一个非空指针并且a_pointer将是some_function返回的指针的副本,则if条件的主体将执行。

    与海象运算符不同的是,这有一个限制,即必须首先在 if 条件之外定义 a_pointer


    C++17 增加了一些更接近的东西,因为您可以使用特殊的 if-initializer 语法在 if 条件内初始化一个变量:

    if (Foo* a_pointer = some_function(); a_pointer) {
        //...
    }
    

    请注意,初始化器仍然不会直接影响if 条件的真实性。只有; 之后的表达式决定了if 语句的主体是否会执行。在这种情况下,a_pointer 在初始化器中被初始化为some_function 返回的值,然后条件部分检查a_pointer 是否为真。

    【讨论】:

    • if (Foo* a_pointer = some_function()) 工作得非常好,不过
    • 这就是我要找的答案,谢谢!我想知道是否有办法减少声明指针所需的行,并将其从两行分配到 1 行,基本上是我感兴趣的海象运算符的唯一功能,也谢谢@PatrickParker ,不知道你指的是什么版本的c++,不过我很欣赏!
    猜你喜欢
    • 1970-01-01
    • 2022-06-30
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    相关资源
    最近更新 更多