fork download
  1. #include <iostream>
  2. #include <cassert>
  3.  
  4. namespace functional_vector {
  5.  
  6. template<typename T>
  7. class optional_t {
  8. public:
  9. optional_t(): m_value{nullptr}{}
  10.  
  11. template<typename ...Args>
  12. optional_t(Args&&...args): m_value{ new T{ std::forward<Args>(args)... }}{}
  13. // optional_t(T const &val): m_value{ new T{val} }{}
  14. ~optional_t(){ reset(); }
  15.  
  16. bool has_value(){ return m_value != nullptr; }
  17.  
  18. T* operator->(){
  19. return m_value;
  20. }
  21.  
  22. T& operator*(){
  23. assert(m_value);
  24. return *m_value;
  25. }
  26.  
  27. T& value(){
  28. assert(m_value);
  29. return *m_value;
  30. }
  31.  
  32. T const & value() const {
  33. assert(m_value);
  34. return *m_value;
  35. }
  36.  
  37. optional_t<T>& operator=( T const & value ){
  38. assert(m_value);
  39. *m_value = value;
  40. return *this;
  41. }
  42.  
  43. template<typename ...Args>
  44. T& emplace(Args && ...args){
  45. reset();
  46. m_value = new T( std::forward<Args>(args)... );
  47. return *m_value;
  48. }
  49.  
  50. private:
  51. void reset(){
  52. if(m_value){
  53. delete m_value;
  54. m_value = nullptr;
  55. }
  56. }
  57.  
  58. T* m_value;
  59. };
  60. }
  61.  
  62. struct foo_t {
  63. int a{};
  64. };
  65.  
  66. template<typename T>
  67. using opt_value_t = functional_vector::optional_t<T>;
  68. using opt_string_t = opt_value_t<std::string>;
  69.  
  70.  
  71. int main(int argc, char **argv)
  72. {
  73. opt_string_t opt_string{};
  74. std::cout << std::boolalpha << opt_string.has_value() << std::endl;
  75.  
  76. auto& str = opt_string.emplace(10, 'a');
  77.  
  78. std::cout << opt_string.has_value() << std::endl << std::noboolalpha;
  79.  
  80. std::cout << opt_string.value() << " " << *opt_string
  81. << " " << str << std::endl << std::endl;
  82.  
  83. opt_value_t<foo_t> foo{10};
  84. std::cout << foo->a << std::endl;
  85. return 0;
  86. }
  87.  
  88.  
Success #stdin #stdout 0.01s 5508KB
stdin
Standard input is empty
stdout
false
true
aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa

10