Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++11 C++;11魔术测试和分配从指针如果不是nullptr_C++11 - Fatal编程技术网

C++11 C++;11魔术测试和分配从指针如果不是nullptr

C++11 C++;11魔术测试和分配从指针如果不是nullptr,c++11,C++11,好吧,我相信防御性编程。我假设如果我得到一个指针,它可能是空的(特别是在使用GSOAP时)。因此,在尝试使用指针的值之前,我总是检查以确保指针不为null 在我当前的代码中,这导致了许多几乎相同的语句 if (res->A) { item.out_trace->a = *res->A; } if (res->B) { item.out_trace->b = *res->B; } if (res->C) { item.out_tra

好吧,我相信防御性编程。我假设如果我得到一个指针,它可能是空的(特别是在使用GSOAP时)。因此,在尝试使用指针的值之前,我总是检查以确保指针不为null

在我当前的代码中,这导致了许多几乎相同的语句

if (res->A) {
    item.out_trace->a = *res->A;
}
if (res->B) {
    item.out_trace->b = *res->B;
}
if (res->C) {
    item.out_trace->b = *res->C;
}
我意识到我总是可以为此定义一个宏,但我想知道是否有一个简洁的C++11技巧可以做到这一点。我喜欢像C#

// Set y to the value of x if x is NOT null; otherwise, 
// if x = null, set y to -1. 
int y = x ?? -1;

谢谢。

也许这样的模板可以满足您的需要:

template<typename T>
T safe_get( T const *ptr, T defval = T{} ) {
    return ptr ? *ptr : std::move(defval);
}

理想情况下,它应该是内联的,并且有效地零开销(当然,除了执行安全检查和拥有分支的固有开销)。

也许这样的模板可以满足您的需要:

template<typename T>
T safe_get( T const *ptr, T defval = T{} ) {
    return ptr ? *ptr : std::move(defval);
}

理想情况下,它应该是内联的,并且有效地零开销(当然,除了执行安全检查和拥有分支的固有开销)。

也许这样的模板可以满足您的需要:

template<typename T>
T safe_get( T const *ptr, T defval = T{} ) {
    return ptr ? *ptr : std::move(defval);
}

理想情况下,它应该是内联的,并且有效地零开销(当然,除了执行安全检查和拥有分支的固有开销)。

也许这样的模板可以满足您的需要:

template<typename T>
T safe_get( T const *ptr, T defval = T{} ) {
    return ptr ? *ptr : std::move(defval);
}



理想情况下,它应该是内联的,并且有效地为零开销(当然,除了执行安全检查和拥有分支的固有开销)。

在代码中没有理由这样做;获取空指针的地址是完全有效和安全的。或者你的意思是
*res->A
?@Lightness是的。我的意思是
*res->A
。。。。这是漫长的一周。。。现在修好了。三元运算符,会做什么??是否:
item.out\u trace->a=res->a*res->A:-1
@NikosAthanasiou我想在宏中使用三元运算符以使其更易于阅读。就我个人而言,我只需将三个
if
语句转换为一行程序,就可以了。代码中唯一的重复就是重复
res->X
,这并不能证明求助于黑暗艺术是合理的。任何宏/模板魔术都会掩盖正在发生的事情;获取空指针的地址是完全有效和安全的。或者你的意思是
*res->A
?@Lightness是的。我的意思是
*res->A
。。。。这是漫长的一周。。。现在修好了。三元运算符,会做什么??是否:
item.out\u trace->a=res->a*res->A:-1
@NikosAthanasiou我想在宏中使用三元运算符以使其更易于阅读。就我个人而言,我只需将三个
if
语句转换为一行程序,就可以了。代码中唯一的重复就是重复
res->X
,这并不能证明求助于黑暗艺术是合理的。任何宏/模板魔术都会掩盖正在发生的事情;获取空指针的地址是完全有效和安全的。或者你的意思是
*res->A
?@Lightness是的。我的意思是
*res->A
。。。。这是漫长的一周。。。现在修好了。三元运算符,会做什么??是否:
item.out\u trace->a=res->a*res->A:-1
@NikosAthanasiou我想在宏中使用三元运算符以使其更易于阅读。就我个人而言,我只需将三个
if
语句转换为一行程序,就可以了。代码中唯一的重复就是重复
res->X
,这并不能证明求助于黑暗艺术是合理的。任何宏/模板魔术都会掩盖正在发生的事情;获取空指针的地址是完全有效和安全的。或者你的意思是
*res->A
?@Lightness是的。我的意思是
*res->A
。。。。这是漫长的一周。。。现在修好了。三元运算符,会做什么??是否:
item.out\u trace->a=res->a*res->A:-1
@NikosAthanasiou我想在宏中使用三元运算符以使其更易于阅读。就我个人而言,我只需将三个
if
语句转换为一行程序,就可以了。代码中唯一的重复就是重复
res->X
,这并不能证明求助于黑暗艺术是合理的。任何宏/模板魔术都会掩盖正在发生的事情。我会从
optional
中窃取一个页面,并将其称为
value\u或
。表达式的类型是什么
*ptr?:请?我想标准上说它是
,换句话说,它等同于
ptr?std::move(*ptr):std::move(defval)
。换句话说,你不小心从
*ptr
@MaximYegorushkin移动了:不,你不可能不小心移动,至少不能从
T常量&
移动。我会从
optional
偷取一个页面,称之为
value\u或
。表达式的类型是什么请?我想标准上说它是
,换句话说,它等同于
ptr?std::move(*ptr):std::move(defval)
。换句话说,你不小心从
*ptr
@MaximYegorushkin移动了:不,你不可能不小心移动,至少不能从
T常量&
移动。我会从
optional
偷取一个页面,称之为
value\u或
。表达式的类型是什么请?我想标准上说它是
,换句话说,它等同于
ptr?std::move(*ptr):std::move(defval)
。换句话说,你不小心从
*ptr
@MaximYegorushkin移动了:不,你不可能不小心移动,至少不能从
T常量&
移动。我会从
optional
偷取一个页面,称之为
value\u或
。表达式的类型是什么请?我想标准上说它是
,换句话说,它等同于
ptr?std::move(*ptr):std::move(defval)
。换句话说,您意外地从
*ptr
@MaximYegorushkin移动: