C#null coalescing运算符等效于c ++

aaj*_*tak 21 c# c++ null null-coalescing-operator

C#null合并运算符是否有C++等价物?我在代码中进行了太多的空检查.所以正在寻找一种减少空代码量的方法.

ada*_*ton 15

我刚发现了这个:?? 运算符又是Null Coalescing运算符

您还可以使用?: 运算符将它作为GNU扩展在C/C++中使用:

string pageTitle = getTitle() ?: "Default Title";
Run Code Online (Sandbox Code Playgroud)

  • 新链接:https://gcc.gnu.org/onlinedocs/gcc-5.3.0/gcc/Conditionals.html#Conditionals 简而言之,GNU 扩展允许您省略三元的中间,这会导致条件成为在该条件为“非零”的情况下返回值 (2认同)

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)

  • 在该方法中,即使a不为空,也评估b.如果b有副作用,这可能是一个问题. (16认同)
  • 如果它是C++ 11或更高版本,请使用`nullptr`.无论如何,在C/C++中没有"null",在某些头文件中只定义了"NULL".http://stackoverflow.com/questions/1282295/what-exactly-is-nullptr (4认同)
  • @Amnon:的确如此.考虑:`p = Coalesce(p,new int(10));`.另外,在C#中,右手操作数似乎不能为NULL(在编译时无法检查,因为C++中没有可空类型?).另一方面:在C++中是否需要它,所以你不能只输入`a?a:b;`? (3认同)

Sam*_*cía 5

使用模板和 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 中构成了一点样板,但这是我们能做的最好的事情,直到语言提供开箱即用的支持。

  • 这是提供与空合并运算符相同语义的唯一答案。不过,这可能很少值得大惊小怪。真的,这个功能只需要在语言中。 (2认同)