C++ 是否有一个函数接受两个指针并返回一个';它不是空的吗?
如果我有两个相同类型的指针,其中一个为null,是否有一个函数/明显的一行程序可以有效地返回非null的指针?我知道我可以用一些嵌套的C++ 是否有一个函数接受两个指针并返回一个';它不是空的吗?,c++,pointers,C++,Pointers,如果我有两个相同类型的指针,其中一个为null,是否有一个函数/明显的一行程序可以有效地返回非null的指针?我知道我可以用一些嵌套的if块来实现这一点,但我只是想知道是否有更紧凑的方法来实现这一点 编辑:如果同时定义了两个或两个都未定义,则此操作也可以返回null,这将是最佳选择。条件运算符: pointer = (p1 != nullptr) ? p1 : p2; 如果两者都不为null,则返回null: pointer = (p1 && p2) ? nullptr : (
if
块来实现这一点,但我只是想知道是否有更紧凑的方法来实现这一点
编辑:如果同时定义了两个或两个都未定义,则此操作也可以返回null,这将是最佳选择。条件运算符:
pointer = (p1 != nullptr) ? p1 : p2;
如果两者都不为null,则返回null:
pointer = (p1 && p2) ? nullptr : ((p1 != nullptr) ? p1 : p2);
如果两者都为null,则返回其中一个将返回null。条件运算符:
pointer = (p1 != nullptr) ? p1 : p2;
如果两者都不为null,则返回null:
pointer = (p1 && p2) ? nullptr : ((p1 != nullptr) ? p1 : p2);
如果两者都为null,则返回其中一个将返回null
Edit:如果同时返回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 */
}
Edit:如果同时返回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 */
}
在其他语言中,此功能称为合并。就像在sql中一样。
显然没有内置函数,但这里讨论了在其他语言中实现它的不同方法。此功能称为coalesce。就像在sql中一样。
显然没有内置函数,但这里讨论了实现它的不同方法
void* getUniquePointer(const void * const a, const void * const b)
{
auto mask = -(uintptr_t)(!!a ^ !!b); // all ones if only one is defined, 0 otherwise
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
ret
如果两者都定义了,则不需要返回null,那么就更简单了
void* getUniquePointer(const void *a, const void *b)
{
return (void*)((uintptr_t)a | (uintptr_t)b);
}
这是一个无分支的按位版本
void* getUniquePointer(const void * const a, const void * const b)
{
auto mask = -(uintptr_t)(!!a ^ !!b); // all ones if only one is defined, 0 otherwise
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
ret
如果两者都定义了,则不需要返回null,那么就更简单了
void* getUniquePointer(const void *a, const void *b)
{
return (void*)((uintptr_t)a | (uintptr_t)b);
}
返回a?a:b代码>?紧凑性不是特别有用<代码>如果(a==nullptr)返回b;否则返回一个
可能会生成与返回a相同的代码?a:b代码>。优化可读性。(就我个人而言,我觉得条件运算符可读性足够。YMMV。)您还应该考虑如果两个指针都为null,或者如果两个指针都为null,该怎么办。如果你不想处理这种情况,那就行了,但是你应该把它作为对调用方的要求。@ TKAUSL抱歉,我在编辑的时候,你发布了它。@ KethththppsEnthEnter本来就很好,但是我想处理两个/两者都不被定义的情况。一个不能在CPP中链接三元语句吗?<代码>返回a?代码>?紧凑性不是特别有用<代码>如果(a==nullptr)返回b;否则返回一个
可能会生成与返回a相同的代码?a:b代码>。优化可读性。(就我个人而言,我觉得条件运算符可读性足够。YMMV。)您还应该考虑如果两个指针都为null,或者如果两个指针都为null,该怎么办。如果你不想处理这种情况,那没关系,但是你应该把它记录在调用方上。@ Tkaull对不起,当你发布它时,我正处于编辑的中间。@ KethththppsEnthEnter本来就很好,但是我想处理两个/两者都不被定义的情况。但可能需要在地址中添加一个“…如果两个…都已定义,则返回null。”(可能是在您的回答之后添加的)@DavidC.Rankin,很抱歉。虽然我已经完全忘记了三元条件,但看起来(至少很明显)我不能用它们来评估所有4种情况。很好的更新,我喜欢它,但是我总是需要仔细研究才能找出双三元组:)
修复是值得的。没有必要对nullptr
进行显式比较,因为std::nullptr\u t
可以隐式转换为bool
:see via。三元组可以,但可能需要添加一个地址“…如果两者都定义了,则返回null。”(这可能是在您的回答之后添加的)@DavidC.Rankin是的,我很抱歉。虽然我已经完全忘记了三元条件,但看起来(至少很明显)我不能用它们来评估所有4种情况。很好的更新,我很喜欢,但我总是要仔细检查以找出双三元条件(:)
修复是值得的。由于std::nullptr\t
可以隐式转换为bool
:请参阅via,因此无需与nullptr
进行显式比较。