【发布时间】:2013-04-29 00:43:27
【问题描述】:
有没有人在 C++ 中实现了一个空传播运算符,类似于函数式语言中使用的那个?我正在考虑一些巧妙的模板解决方案,可能类似于 operator-> 的传播行为。
假设我们有一个来自图表的对象链,例如foo->bar->baz(对不起,得墨忒耳定律)。假设其中任何一个都可以为空,并且应该在取消引用之前进行测试。然后代码突然变得复杂了很多:
if( !foo )
return nullptr;
if( !foo->bar )
return nullptr;
return foo->bar->baz;
我想用某种紧凑的语法“分解”空检查,如下所示:
foo?->bar?->baz // imaginary null-propagation syntax
现在,它当然不必看起来像那样,只要几乎一样紧凑。我想需要的是 C++ 中的 monad,启用空测试和“延续”。最好避免使用宏和 lambda,但这可能是不可能的。我可以想象在每一步都重载 operator->() 并在 this 为空时短路。
但这非常具有侵入性。理想的解决方案是将链中的每个对象包装起来。
【问题讨论】:
-
你能举一个你的运营商在使用的例子吗?
-
你的意思是像 Haskell 中的
Maybemonad 吗? -
我认为你应该充实你的“问题”;据说你不只是在寻找“是的,他们有”。如果您想询问有关您的解决方案的问题,请这样做(但请记住还有Code Review)。
-
@KennyTM 是的,就像 Maybe monad。也许我的问题需要一定程度的语言“可编程性”,而这在 C++ 中是不存在的。但很好奇是否有人尝试过拼凑它。
-
return foo && foo->bar ? foo->bar->baz : nullptr;输入太多了吗?或者,如果您有 100 个间接级别怎么办?好吧,那么您可能不应该编写代码。