aaj*_*tak 21 c# c++ null null-coalescing-operator
C#null合并运算符是否有C++等价物?我在代码中进行了太多的空检查.所以正在寻找一种减少空代码量的方法.
ada*_*ton 15
我刚发现了这个:?? 运算符又是Null Coalescing运算符
您还可以使用
?:
运算符将它作为GNU扩展在C/C++中使用:Run Code Online (Sandbox Code Playgroud)string pageTitle = getTitle() ?: "Default Title";
McK*_*Kay 12
默认情况下,在C++中没有办法执行此操作,但您可以编写一个:
在C#中?运算符定义为
a ?? b === (a != null ? a : b)
Run Code Online (Sandbox Code Playgroud)
所以,C++方法看起来像
Coalesce(a, b) // put your own types in, or make a template
{
return a != null ? a : b;
}
Run Code Online (Sandbox Code Playgroud)
使用模板和 C++11 lambdas。第一个参数(左侧)只计算一次。仅当第一个参数为假时才评估第二个参数(右侧)。
template<typename TValue, typename TRhsEvaluator>
TValue coalesce(TValue lhsValue, TRhsEvaluator evaluateRhs) {
return lhsValue ? lhsValue : evaluateRhs();
}
Run Code Online (Sandbox Code Playgroud)
请注意,if
并?
静态地将提供的表达式转换为bool
,并且指针具有explicit operator bool() const
与!= nullptr
用法示例:
void * const nonZeroPtr = reinterpret_cast<void *>(0xF);
void * const otherNonZeroPtr = reinterpret_cast<void *>(0xA);
std::cout << coalesce(nonZeroPtr, [&] () {
std::cout << "Side-effect. Should never be printed" << std::endl;
return otherNonZeroPtr;
}) << std::endl;
Run Code Online (Sandbox Code Playgroud)
上面的代码只会打印0xf
到控制台。必须将右侧包装在 lambda 中构成了一点样板,但这是我们能做的最好的事情,直到语言提供开箱即用的支持。