fork download
  1. #include <iostream>
  2. using namespace std;
  3.  
  4.  
  5. template <typename T>
  6. struct St1
  7. {
  8. St1 () = default;
  9.  
  10. St1 (const St1& other) : hasValue (other.hasValue) { if (hasValue) value = other.value; }
  11.  
  12. St1 (St1&& other) : hasValue (other.hasValue) { if (hasValue) value = std::move(other.value); }
  13.  
  14. template <typename Arg0, typename... Args >
  15. explicit St1 (Arg0 arg0, Args&&... args) : hasValue (true) { value = T(std::forward<Arg0>(arg0), std::forward<Args>(args)...); }
  16.  
  17. T value;
  18. bool hasValue { false };
  19. };
  20.  
  21. template <typename T>
  22. struct St2
  23. {
  24. St2 () = default;
  25.  
  26. St2 (const St2& other) : hasValue (other.hasValue) { if (hasValue) value = other.value; }
  27.  
  28. St2 (St2&& other) : hasValue (other.hasValue) { if (hasValue) value = std::move(other.value); }
  29.  
  30. explicit St2 (const T &value) : hasValue (true) { this->hasValue = value; }
  31.  
  32. explicit St2 (T &&value) : hasValue (true) { this->value = std::move(value); }
  33.  
  34. T value;
  35. bool hasValue { false };
  36. };
  37.  
  38. template <typename T>
  39. struct St3
  40. {
  41. St3 () = default;
  42.  
  43. St3 (const St3& other) : hasValue (other.hasValue) { if (hasValue) value = other.value; }
  44.  
  45. St3 (St3&& other) : hasValue (other.hasValue) { if (hasValue) value = std::move(other.value); }
  46.  
  47. template <typename... Args >
  48. explicit St3 (Args&&... args) : hasValue (true) { value = T(std::forward<Args>(args)...); }
  49.  
  50. T value;
  51. bool hasValue { false };
  52. };
  53.  
  54. template <typename T>
  55. struct St4
  56. {
  57. St4 () = default;
  58.  
  59. St4 (const St4& other) : hasValue (other.hasValue) { if (hasValue) value = other.value; }
  60.  
  61. St4 (St4&& other) : hasValue (other.hasValue) { if (hasValue) value = std::move(other.value); }
  62.  
  63. explicit St4 (T value) : hasValue (true) { this->value = value; }
  64.  
  65. template <typename... Args >
  66. explicit St4 (Args&&... args) : hasValue (true) { value = T(std::forward<Args>(args)...); }
  67.  
  68. T value;
  69. bool hasValue { false };
  70. };
  71.  
  72. template <typename T>
  73. struct St5
  74. {
  75. St5 () {};
  76.  
  77. St5 (const St5& other) : hasValue (other.hasValue) { if (hasValue) value = other.value; }
  78.  
  79. St5 (St5&& other) : hasValue (other.hasValue) { if (hasValue) value = std::move(other.value); }
  80.  
  81. explicit St5 (T value) : hasValue (true) { this->value = value; }
  82.  
  83. template <typename... Args >
  84. explicit St5 (Args&&... args) : hasValue (true) { value = T(std::forward<Args>(args)...); }
  85.  
  86. T value;
  87. bool hasValue { false };
  88. };
  89.  
  90.  
  91. int main() {
  92.  
  93. St1<int> a1;
  94. St1<int> a2 {2};
  95. St1<int> a3 {};
  96.  
  97. St2<int> b1;
  98. St2<int> b2 {2};
  99. St2<int> b3 {};
  100.  
  101. St3<int> c1;
  102. St3<int> c2 {2};
  103. St3<int> c3 {};
  104.  
  105. St4<int> d1;
  106. St4<int> d2 {2};
  107. St4<int> d3 {};
  108.  
  109. St5<int> e1;
  110. St5<int> e2 {2};
  111. St5<int> e3 {};
  112.  
  113. cout << "St1:\n";
  114. cout << (a1.hasValue == 0) << '\n';
  115. cout << (a2.hasValue == 1) << '\n';
  116. cout << (a2.value == 2) << '\n';
  117. cout << (a3.hasValue == 0) << '\n';
  118.  
  119. cout << "St2:\n";
  120. cout << (b1.hasValue == 0) << '\n';
  121. cout << (b2.hasValue == 1) << '\n';
  122. cout << (b2.value == 2) << '\n';
  123. cout << (b3.hasValue == 0) << '\n';
  124.  
  125. cout << "St3:\n";
  126. cout << (c1.hasValue == 0) << '\n'; // failed in VS
  127. cout << (c2.hasValue == 1) << '\n'; // failed in VS
  128. cout << (c2.value == 2) << '\n'; // failed in VS
  129. cout << (c3.hasValue == 0) << '\n';
  130.  
  131. cout << "St4:\n";
  132. cout << (d1.hasValue == 0) << '\n'; // failed in VS
  133. cout << (d2.hasValue == 1) << '\n';
  134. cout << (d2.value == 2) << '\n';
  135. cout << (d3.hasValue == 0) << '\n';
  136.  
  137. cout << "St5:\n";
  138. cout << (e1.hasValue == 0) << '\n';
  139. cout << (e2.hasValue == 1) << '\n';
  140. cout << (e2.value == 2) << '\n';
  141. cout << (e3.hasValue == 0) << '\n';
  142.  
  143. return 0;
  144. }
Success #stdin #stdout 0s 16064KB
stdin
Standard input is empty
stdout
St1:
1
1
1
1
St2:
1
1
1
1
St3:
1
1
1
1
St4:
1
1
1
1
St5:
1
1
1
1