<分区>
为避免异常,在使用内部指针之前必须检查指针链中的每个指针。
是否有现代的 c++ 语法,或者一些简单的方法来取代繁琐的:
if (pA && pA->pB && pA->pB->pC)
pA->pB->pC->DoYerThing();
进入类似下面的内容?
if(not_nullptrs(pA->pB->pC))
pA->pB->pC->DoYerThing();
<分区>
为避免异常,在使用内部指针之前必须检查指针链中的每个指针。
是否有现代的 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/