如果我有两个相同类型的指针,而一个指针为null,是否有一个函数/明显的单线可有效返回非null的指针?我知道我可以使用一些嵌套的if
块来做到这一点,但是我只是想知道是否有更紧凑的方法来实现它。
编辑:如果同时定义了两个或两个都未定义的情况下也返回null,则将是最佳选择。
答案 0 :(得分:2)
条件运算符:
pointer = (p1 != nullptr) ? p1 : p2;
如果两个都不为空,则返回null:
pointer = (p1 && p2) ? nullptr : ((p1 != nullptr) ? p1 : p2);
如果两者均为null,则返回任意一个将返回null。
答案 1 :(得分:1)
在其他语言中,此功能称为合并。就像在sql中一样。 显然没有内置功能,但是这里讨论实现该功能的不同方法C# null coalescing operator equivalent for c++
答案 2 :(得分:0)
编辑:最好是,如果同时返回两个或两个,则返回null 都没有定义。
如果只想返回指针a
和b
之间的唯一非nullptr,则可以执行以下操作:
void *rtn_defined_unique (const void *a, const void *b)
{
/* if neither or both, return NULL */
if ((a == nullptr && b == nullptr) || (a && b))
return NULL;
if (a != nullptr) /* if a, return a */
return a;
return b; /* otherwise, it's b */
}
答案 3 :(得分:0)
这是无分支的按位版本
void* getUniquePointer(void *a, void *b)
{
auto mask = -(uintptr_t)(!!a ^ !!b);
return (void*)(((uintptr_t)a | (uintptr_t)b) & mask);
}
Clang会将其编译为
test rdi, rdi
setne al
test rsi, rsi
setne cl
xor cl, al
or rsi, rdi
xor eax, eax
test cl, cl
cmovne rax, rsi