是否有接受两个指针并返回非NULL的函数?

时间:2019-04-14 03:07:03

标签: c++ pointers

如果我有两个相同类型的指针,而一个指针为null,是否有一个函数/明显的单线可有效返回非null的指针?我知道我可以使用一些嵌套的if块来做到这一点,但是我只是想知道是否有更紧凑的方法来实现它。

编辑:如果同时定义了两个或两个都未定义的情况下也返回null,则将是最佳选择。

4 个答案:

答案 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   都没有定义。

如果只想返回指针ab之间的唯一非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

Godbolt link