#include <iostream>
#include <cassert>
namespace functional_vector {
template<typename T>
class optional_t {
public:
optional_t(): m_value{nullptr}{}
template<typename ...Args>
optional_t(Args&&...args): m_value{ new T{ std::forward<Args>(args)... }}{}
// optional_t(T const &val): m_value{ new T{val} }{}
~optional_t(){ reset(); }
bool has_value(){ return m_value != nullptr; }
T* operator->(){
return m_value;
}
T& operator*(){
assert(m_value);
return *m_value;
}
T& value(){
assert(m_value);
return *m_value;
}
T const & value() const {
assert(m_value);
return *m_value;
}
optional_t<T>& operator=( T const & value ){
assert(m_value);
*m_value = value;
return *this;
}
template<typename ...Args>
T& emplace(Args && ...args){
reset();
m_value = new T( std::forward<Args>(args)... );
return *m_value;
}
private:
void reset(){
if(m_value){
delete m_value;
m_value = nullptr;
}
}
T* m_value;
};
}
struct foo_t {
int a{};
};
template<typename T>
using opt_value_t = functional_vector::optional_t<T>;
using opt_string_t = opt_value_t<std::string>;
int main(int argc, char **argv)
{
opt_string_t opt_string{};
std::cout << std::boolalpha << opt_string.has_value() << std::endl;
auto& str = opt_string.emplace(10, 'a');
std::cout << opt_string.has_value() << std::endl << std::noboolalpha;
std::cout << opt_string.value() << " " << *opt_string
<< " " << str << std::endl << std::endl;
opt_value_t<foo_t> foo{10};
std::cout << foo->a << std::endl;
return 0;
}