如何避免在 C++ 中使用链式选项嵌套 if 语句?
例如,如果类型 A 包含std::optional<B> b
和 B 型std::optional<C> c
,我希望能够写出如下内容:
const auto v = if_exists(if_exists(a->b)->c);
如果 b 或 c 是空选项,则 v 将从 c 或空选项中获取值。
我认为这比这样的嵌套 if 更好:
if (a->b) {
const auto b = *(a->b);
if (b->c) {
const auto c = *(b->c);
}
}
以下问题似乎朝这个方向发展,但我不确定如何使其适应我的用例:C++11 中的 Haskell 风格“也许”类型和*链接* https://stackoverflow.com/questions/7690864/haskell-style-maybe-type-chaining-in-c11
您可以执行类似的操作(伪代码;下面提供了可构建代码的链接):
// wrap std::optional for chaining
template <class T> class Maybe {
std::optional<T> t;
// ... constructors etc
// Maybe chaining
// If A has a member named m of type M,
// then Maybe<A>.fetch(&A::m) returns a Maybe<M>
template <class M>
Maybe<M> fetch(M T::*mem_ptr) {
return (bool(t)) ? Maybe<M>((*t).*mem_ptr) : Maybe<M>() ;
}
// Maybe chaining special case
// If A has a member named m, which is itself a Maybe<M>,
// then return it without wrapping it in an additional Maybe
template <class M>
Maybe<M> fetch(Maybe<M> T::*mem_ptr) {
return (bool(t)) ? ((*t).*mem_ptr) : Maybe<M>() ;
}
};
现在如果你有这个:
struct C { int d ; }
struct B { C c; }
struct A { B b; }
A a;
Maybe<A> ma;
你可以这样做
int d = a.b.c.d;
你不能做同样的事ma
,但您可以使用下一个最好的方法,即:
Maybe<int> md = ma.fetch(&A::b).fetch(&B::c).fetch(&C::d);
如果您仍然可以使用它Maybe
-ify 任何或全部struct
上述成员:
struct C { Maybe<int> d ; }
struct B { Maybe<C> c; }
struct A { Maybe<B> b; }
实例(不是生产质量,而是构建) https://ideone.com/46aLXM.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)