C++ C++;C#和#x27的等效值;s"&引用;空条件运算符
在C中,有一个空条件运算符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+
?。
:
MyObject o = null;
o?.doSomeThing();
这意味着:
if(o != null)
o.doSomeThing();
我想要一些类似的C++语言:
MyObject* o = nullptr;
o?>doSomeThing(); // or o?->
写下以下内容非常有用:
o?.getO()?.getO()?.doSomeThing();
所以我有两个问题:
代码> CONTXPRP</代码>和
)std::vector::size()
#包括
#包括
模板
结构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或其他对象。我不会把这写成一封班轮,类似于这个问题:好吧,我会咬人的。谢谢。但我看不出你的帖子有任何部分回答了我的问题。