#include <boost/optional.hpp>
#include <iostream>
template<class T, class F>
boost::optional<T> bind_opt(boost::optional<T> const& opt, F f){
return opt ? f(opt.get()) : boost::none;
}
template<class T>
std::ostream& show_opt(std::ostream& os, boost::optional<T> const& opt){
if(opt)
return os << opt.get();
return os << "None";
}
typedef boost::optional<int> int_opt;
// you could make this a C++11 lambda, but
// Ideone in C++11 mode doesn't have Boost
int_opt test_even(int i){
return (i % 2 == 0) ? int_opt(i * 3) : boost::none;
}
int main(){
int_opt o1 = 7;
int_opt o2 = 8;
int_opt o3 = boost::none;
int_opt p1 = bind_opt(o1, test_even);
int_opt p2 = bind_opt(o2, test_even);
int_opt p3 = bind_opt(o3, test_even);
show_opt(std::cout, p1) << "\n";
show_opt(std::cout, p2) << "\n";
show_opt(std::cout, p3) << "\n";
}
I2luY2x1ZGUgPGJvb3N0L29wdGlvbmFsLmhwcD4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgRj4KYm9vc3Q6Om9wdGlvbmFsPFQ+IGJpbmRfb3B0KGJvb3N0OjpvcHRpb25hbDxUPiBjb25zdCYgb3B0LCBGIGYpewogIHJldHVybiBvcHQgPyBmKG9wdC5nZXQoKSkgOiBib29zdDo6bm9uZTsKfQoKdGVtcGxhdGU8Y2xhc3MgVD4Kc3RkOjpvc3RyZWFtJiBzaG93X29wdChzdGQ6Om9zdHJlYW0mIG9zLCBib29zdDo6b3B0aW9uYWw8VD4gY29uc3QmIG9wdCl7CiAgaWYob3B0KQogICAgcmV0dXJuIG9zIDw8IG9wdC5nZXQoKTsKICByZXR1cm4gb3MgPDwgIk5vbmUiOwp9Cgp0eXBlZGVmIGJvb3N0OjpvcHRpb25hbDxpbnQ+IGludF9vcHQ7CgovLyB5b3UgY291bGQgbWFrZSB0aGlzIGEgQysrMTEgbGFtYmRhLCBidXQKLy8gSWRlb25lIGluIEMrKzExIG1vZGUgZG9lc24ndCBoYXZlIEJvb3N0CmludF9vcHQgdGVzdF9ldmVuKGludCBpKXsKICAgIHJldHVybiAoaSAlIDIgPT0gMCkgPyBpbnRfb3B0KGkgKiAzKSA6IGJvb3N0Ojpub25lOwp9CgppbnQgbWFpbigpewogIGludF9vcHQgbzEgPSA3OwogIGludF9vcHQgbzIgPSA4OwogIGludF9vcHQgbzMgPSBib29zdDo6bm9uZTsKICBpbnRfb3B0IHAxID0gYmluZF9vcHQobzEsIHRlc3RfZXZlbik7CiAgaW50X29wdCBwMiA9IGJpbmRfb3B0KG8yLCB0ZXN0X2V2ZW4pOwogIGludF9vcHQgcDMgPSBiaW5kX29wdChvMywgdGVzdF9ldmVuKTsKICBzaG93X29wdChzdGQ6OmNvdXQsIHAxKSA8PCAiXG4iOwogIHNob3dfb3B0KHN0ZDo6Y291dCwgcDIpIDw8ICJcbiI7CiAgc2hvd19vcHQoc3RkOjpjb3V0LCBwMykgPDwgIlxuIjsKfQ==