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