C++ C++;C#和#x27的等效值;s"&引用;空条件运算符

C++ C++;C#和#x27的等效值;s"&引用;空条件运算符,c++,operators,C++,Operators,在C中,有一个空条件运算符?。: MyObject o = null; o?.doSomeThing(); 这意味着: if(o != null) o.doSomeThing(); 我想要一些类似的C++语言: MyObject* o = nullptr; o?>doSomeThing(); // or o?-> 写下以下内容非常有用: o?.getO()?.getO()?.doSomeThing(); 所以我有两个问题: 今天,我们使用宏进行单行条件执行。在C+

在C中,有一个空条件运算符
?。

MyObject o = null;

o?.doSomeThing();
这意味着:

if(o != null)
    o.doSomeThing();
我想要一些类似的C++语言:

MyObject* o = nullptr;

o?>doSomeThing(); // or o?->
写下以下内容非常有用:

o?.getO()?.getO()?.doSomeThing();
所以我有两个问题:

  • 今天,我们使用宏进行单行条件执行。在C++14中有没有一种简单易行的方法不使用宏
  • 有讨论或建议吗?我什么也没找到
  • 书面问题#1:

    代码> CONTXPRP</代码>和内联函数是宏函数的类型安全C++等价物。它们不能保证内联您的代码,但它们允许编译器根据需要进行复制,而一个积极的编译器将为您进行内联。许多标准库类都做出了这种假设(例如,

    std::vector::size()

    编辑:好吧,你们都很性感,但很公平。下面是一种使用它来解决此问题的方法:

    编辑:根据要求更新为在C++14中编译。我知道这已经被标记为重复,没有人会去看它,但其他链接只是C++17。它还终止于非指针成员并返回指向它们的指针,这与C#更为一致,C#将值类型转换为可为null的值类型

    #包括
    #包括
    模板
    结构SafePtrImpl{
    类别*ptr;
    SafePtrImpl(类*ptr):ptr(ptr){}
    模板
    内联安全触发器<
    标准::删除指针\u t<
    标准::删除参考<
    TResult>>>运算符->*(TResult TClass::*成员){
    返回安全ptr(ptr?ptr->*成员:nullptr);
    }
    模板=nullptr>
    内联TResult*运算符->*(TResult TClass::*成员){
    返回ptr?&(ptr->*成员):空ptr;
    }
    };
    模板
    SafePtrImpl SafePtr(TClass*ptr){返回SafePtrImpl(ptr);}
    // --
    结构Foo{
    int x;
    };
    结构条{
    富*y;
    };
    int main(){
    福阿{42};
    巴{&a};
    条c{nullptr};
    Bar*d=nullptr;
    int*b_y_x=SafePtr(&b)->*&Bar::y->*&Foo::x;
    int*c_y_x=SafePtr(&c)->*&Bar::y->*&Foo::x;
    int*d_y_x=SafePtr(d)->*&Bar::y->*&Foo::x;
    printf(“b:%08x%d\n”,b_y_x,*b_y_x);
    printf(“c:%08x\n”,c\u y\u x);
    printf(“d:%08x\n”,d_y_x);
    返回0;
    }
    

    输出:

    b: 3aa42aec 42
    c: 00000000
    d: 00000000
    

    不,没有语法可以做到这一点,也没有方法创建所述语法

    同样,也没有(据我所知)建议添加它


    相反,您可以自己编写空检查,或者更好的做法是通过重新构造代码来减少可以为“空”的位置的数量,这样您就不需要空检查了。

    No,@oznog std::optional不做这种事情,或者任何类似的东西。@PaulR,如果doSomeThing返回的东西不能转换为bool(我想),那么这就不起作用了。除此之外,这是一个很好的解决方案,因为链接是有效的。@JesperJuhl
    if(o&&o->getO()&&o->getO()->getO()->getO())o->getO()->getO()->doSomeThing()好,这是语法上的suggar…我对Jesper的回答是错误的,必须是:
    if(o)if(auto-o1=o->getO())if(auto-o2=o1->getO())o2->doSomeThing()否则getter将执行两次,第二次执行可能返回null ptr或其他对象。我不会把这写成一封班轮,类似于这个问题:好吧,我会咬人的。谢谢。但我看不出你的帖子有任何部分回答了我的问题。