Maybe在我的工作项目中,我反复发现自己需要Haskell风格(尤其是Maybe chaining).例如,来自客户的提款请求,我们获得客户ID ...在缓存中查找客户...如果找到客户...查找她的储蓄账户...如果有账户...退出...在任何指向此链中,如果存在查找失败,则不执行任何操作并返回失败.
我的链很大......有时只要6 ...所以这里是我Haskell.Data.Maybe在C++ 0x中的滑动...(注意......如果我停止使用可变参数模板,这应该在C++中工作).我已经开始为自由函数链接一个参数或成员函数没有参数,我对接口感到满意.但是,对于采用多个参数的函数...我必须编写一个lambda函数来模拟部分应用程序.有没有办法避免它?见最后一行main().即使它是未注释的,它也不会编译,而是用于const/non-const混合.但问题仍然存在.
对于大量的代码感到抱歉...我希望这不会让那些可能对此感兴趣的人感到震惊......
#include <iostream>
#include <map>
#include <deque>
#include <algorithm>
#include <type_traits>
typedef long long int int64;
namespace monad { namespace maybe {
struct Nothing {};
template < typename T >
struct Maybe {
template < typename U, typename Enable = void >
struct ValueType {
typedef U * const type;
};
template < typename U >
struct ValueType < U, typename std::enable_if < std::is_reference < U >::value >::type > …Run Code Online (Sandbox Code Playgroud) 有人在C++中实现了一个空传播运算符,类似于函数式语言中使用的运算符吗?我正在考虑一些聪明的模板解决方案,可能类似于operator->的传播行为.
让我们假设我们有一个图形对象链,比如foo->bar->baz(对不起,德米特法则).假设其中任何一个都可以为null,并且应在解除引用之前进行测试.然后代码突然变得复杂得多:
if( !foo )
return nullptr;
if( !foo->bar )
return nullptr;
return foo->bar->baz;
Run Code Online (Sandbox Code Playgroud)
我想用某种紧凑的语法"分解"空检查,如下所示:
foo?->bar?->baz // imaginary null-propagation syntax
Run Code Online (Sandbox Code Playgroud)
现在,当然它不必看起来那样,只是几乎紧凑.我想我们需要的是C++中的monad,启用null测试和'continuation'.避免使用宏和lambda会很棒,但这可能是不可能的.我可以想象在每一步都重载operator - >()并且如果this为null 则短路.
但这非常具有侵入性.理想的解决方案是将每个对象包装在链中.