C++ 是否有一个函数接受两个指针并返回一个';它不是空的吗?

C++ 是否有一个函数接受两个指针并返回一个';它不是空的吗?,c++,pointers,C++,Pointers,如果我有两个相同类型的指针,其中一个为null,是否有一个函数/明显的一行程序可以有效地返回非null的指针?我知道我可以用一些嵌套的if块来实现这一点,但我只是想知道是否有更紧凑的方法来实现这一点 编辑:如果同时定义了两个或两个都未定义,则此操作也可以返回null,这将是最佳选择。条件运算符: pointer = (p1 != nullptr) ? p1 : p2; 如果两者都不为null,则返回null: pointer = (p1 && p2) ? nullptr : (

如果我有两个相同类型的指针,其中一个为null,是否有一个函数/明显的一行程序可以有效地返回非null的指针?我知道我可以用一些嵌套的
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
进行显式比较。