gpt4 book ai didi

c++ - C++ 有安全的导航运算符吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:22:01 24 4
gpt4 key购买 nike

在现代 C++ 中,有没有办法进行安全导航?

例如,而不是做...

if (p && p->q && p->q->r)
p->q->r->DoSomething();

...通过使用某种短路智能指针或某种其他类型的利用运算符重载的语法或标准 C++ 库或 Boost 中的某些语法来获得简洁的语法。

p?->q?->r?->DoSomething(); // C++ pseudo-code.

上下文尤其是 C++17。

最佳答案

您能做的最好的事情就是将所有成员访问合并到一个函数中。这假设没有检查一切都是指针:

template <class C, class PM, class... PMs>
auto access(C* c, PM pm, PMs... pms) {
if constexpr(sizeof...(pms) == 0) {
return c ? std::invoke(pm, c) : nullptr;
} else {
return c ? access(std::invoke(pm, c), pms...) : nullptr;
}
}

它可以让你写:

if (auto r = access(p, &P::q, &Q::r); r) {
r->doSomething();
}

没关系。或者,您可以对运算符重载有点疯狂,并生成类似以下内容的内容:

template <class T>
struct wrap {
wrap(T* t) : t(t) { }
T* t;

template <class PM>
auto operator->*(PM pm) {
return ::wrap{t ? std::invoke(pm, t) : nullptr};
}

explicit operator bool() const { return t; }
T* operator->() { return t; }
};

它可以让你写:

if (auto r = wrap{p}->*&P::q->*&Q::r; r) {
r->doSomething();
}

那也行。不幸的是,没有 ->?.? 之类的运算符,所以我们不得不在边缘工作。

关于c++ - C++ 有安全的导航运算符吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45149760/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com