#include <functional>
#include <string>
namespace maybe {
enum MaybeType{
Nothing,
Just
};
}
template<typename T>
class Maybe{
virtual maybe::MaybeType getType() const = 0;
};
template<typename T>
class Just : public Maybe<T>{
T value;
virtual maybe::MaybeType getType() const{
return maybe::MaybeType::Just;
}
public:
Just(T v) : value(v){}
};
template<typename T>
class Nothing : public Maybe<T>{
virtual maybe::MaybeType getType() const{
return maybe::MaybeType::Nothing;
}
};
int main(){
using namespace std;
string s = "Hello";
auto m=Just<string>(s);
}
I2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxzdHJpbmc+Cm5hbWVzcGFjZSBtYXliZSB7CmVudW0gTWF5YmVUeXBlewogIE5vdGhpbmcsCiAgSnVzdAp9Owp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpjbGFzcyBNYXliZXsKICB2aXJ0dWFsIG1heWJlOjpNYXliZVR5cGUgZ2V0VHlwZSgpIGNvbnN0ID0gMDsKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmNsYXNzIEp1c3QgOiBwdWJsaWMgTWF5YmU8VD57CiAgVCB2YWx1ZTsKICB2aXJ0dWFsIG1heWJlOjpNYXliZVR5cGUgZ2V0VHlwZSgpIGNvbnN0ewogICAgcmV0dXJuIG1heWJlOjpNYXliZVR5cGU6Okp1c3Q7CiAgfQpwdWJsaWM6CiAgSnVzdChUIHYpIDogdmFsdWUodil7fQp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KY2xhc3MgTm90aGluZyA6IHB1YmxpYyBNYXliZTxUPnsKICB2aXJ0dWFsIG1heWJlOjpNYXliZVR5cGUgZ2V0VHlwZSgpIGNvbnN0ewogICAgcmV0dXJuIG1heWJlOjpNYXliZVR5cGU6Ok5vdGhpbmc7CiAgfQp9OwoKaW50IG1haW4oKXsKICB1c2luZyBuYW1lc3BhY2Ugc3RkOwogIHN0cmluZyBzID0gIkhlbGxvIjsKICBhdXRvIG09SnVzdDxzdHJpbmc+KHMpOwp9Cg==