c++ - 验证指针链

标签 c++ syntax

<分区>

为避免异常,在使用内部指针之前必须检查指针链中的每个指针。

是否有现代的 c++ 语法,或者一些简单的方法来取代繁琐的:

if (pA && pA->pB && pA->pB->pC)
    pA->pB->pC->DoYerThing();

进入类似下面的内容?

if(not_nullptrs(pA->pB->pC))
    pA->pB->pC->DoYerThing();

最佳答案

这是罗密欧建议的固定版本:

template <typename X0>
auto safe_chain(X0* x0)
{
    return x0;
}

template <typename X0, typename X1, typename... Xs>
auto safe_chain(X0* x0, X1 x1, Xs... xs)
{
    return x0
        ? safe_chain(x0->*x1, xs...)
        : nullptr;
}


// usage
struct C {
    void DoYerThing();
};
struct B {
    C* pC;
};
struct A {
    B* pB;
};

if(auto p = safe_chain(pA, &A::pB, &B::pC))
    p->DoYerThing();

这不是很容易阅读。 pA && pA->pB && pA->pB->pC 就好了。

惯用的解决方案通常是尽可能依赖引用,以便将空指针检查限制在尽可能少的范围内。当确实需要指针时,您应该使用函数(可能是 *pA 的成员函数)以避免重复检查。

关于c++ - 验证指针链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52926431/

相关文章:

c++ - 从输入文件的最后一列确定例程

c++ - 链接器似乎忽略了库并默认为旧版本

c++ - 这是糟糕的风格吗?

c++ - clang++ ABI 和 g++ 一样吗?

C++ 比较命令行参数与 strcmp

c++ - 在 Qvector 中读取文件后存储数据

linux - 变量显示在终端中而不是 append 到 Bash 上的文件中

syntax - 如何使用crontab自动执行反向隧道:语法错误

php - 这些 PHPDOC 属性的用途是什么?

flutter - Flutter 语法中三点 [...] 的含义