fork download
  1. #include <iostream>
  2. #include <type_traits>
  3.  
  4. struct Coordinate
  5. {
  6. double x;
  7. double y;
  8. };
  9.  
  10. template <typename T> class val
  11. {
  12. public:
  13. val(const T& t) : t(t) {}
  14.  
  15. val(const val&) = default;
  16. val& operator = (const val&) = delete;
  17.  
  18. const T* operator->() const { return &t; }
  19. const T& get() const { return t; }
  20.  
  21. T* operator->() { return &t; }
  22. T& get() { return t; }
  23.  
  24. private:
  25. T t;
  26. };
  27.  
  28. template <typename T> class var
  29. {
  30. public:
  31. var(const T& t) : t(t) {}
  32.  
  33. var(const var&) = default;
  34. var& operator = (const var&) = default;
  35. var& operator = (const T&) { this->t = t; return *this; };
  36.  
  37. const T* operator->() const { return &t; }
  38. const T& get() const { return t; }
  39.  
  40. T* operator->() { return &t; }
  41. T& get() { return t; }
  42.  
  43. private:
  44. std::remove_const_t<T> t;
  45. };
  46.  
  47. int main()
  48. {
  49. val<const Coordinate> immutable_val({42, 51});
  50. val<Coordinate> mutable_val({42, 51});
  51. var<const Coordinate> immutable_var({42, 51});
  52. var<Coordinate> mutable_var({42, 51});
  53.  
  54. //immutable_val->x = 42; // error: cannot assign to return value because function 'operator->' returns a const value
  55. mutable_val->x = 42;
  56. //immutable_var->x = 42; // error: cannot assign to return value because function 'operator->' returns a const value
  57. mutable_var->x = 42;
  58.  
  59. //immutable_val = {42, 42}; // error: overload resolution selected deleted operator '='
  60. //mutable_val = {42, 42}; // error: overload resolution selected deleted operator '='
  61. immutable_var = {42, 42};
  62. mutable_var = {42, 42};
  63.  
  64. //mutable_val = mutable_val; // error: overload resolution selected deleted operator '='
  65. //immutable_val = immutable_val; // error: overload resolution selected deleted operator '='
  66. immutable_var = immutable_var;
  67. mutable_var = mutable_var;
  68. }
  69.  
Success #stdin #stdout 0s 3464KB
stdin
Standard input is empty
stdout
Standard output is empty