boost::optionalをつかうとmaybeっぽくできる。

失敗しそうな処理があっても連続的に表記できるってのは
if文が連続しがちなCプログラミングに清涼剤を与えてくれるね。

#include <cmath>
#include <iostream>
#include <boost/optional.hpp>


using namespace std;
using namespace boost;

// double かもしれない 型
typedef optional<double> maybe_double;

// double かもしれない値をうけとり、doubleかもしれない値をかえす関数
maybe_double _sqrt( maybe_double a ){
    if( not a )
        return maybe_double();
    if( *a < 0 )
        return maybe_double();
    return maybe_double(sqrt( *a ));
}

maybe_double _devide( maybe_double a, maybe_double b ){
    if( not ( a and b ) )
        return maybe_double();
    if( *b == 0 )
        return maybe_double();
    return maybe_double( *a / *b );
}

void dump( maybe_double x ){
    if( x )
        cout << *x << endl;
    else
        cout << "failure" << endl;
}
int main(){
    // 関数のどこかで失敗してもok
    dump( _sqrt( 10.0 )); //3.16228
    dump( _sqrt( -10.0 )); //failure
    dump( _sqrt( _devide(20.0,10 ) ));//1.41421
    dump( _sqrt( _devide(20.0,0.0 ) ));//failure
    dump( _sqrt( _devide(20.0,0.0 ) ));//failure
    dump( _devide( 10 , _sqrt( -10 )));//failure
}