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 }