#pragma once template class OptionPtr { public: OptionPtr() {} OptionPtr(T *ptr) : ptr(ptr) {} bool is_present() { return ptr != nullptr; } T *get() { assert(is_present()); return ptr; } private: T *ptr = nullptr; }; template auto make_option_ptr(T *t) { return OptionPtr(t); }