shushus

Спринт 13. Совершенный способ - Forwarding reference.

Apr 20th, 2023
394
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.99 KB | None | 0 0
  1. -----------------------------------------------------------------------
  2. any.cpp
  3. -----------------------------------------------------------------------
  4. #include <iostream>
  5. #include <string>
  6. #include <string_view>
  7. #include <memory>
  8.  
  9. using namespace std;
  10.  
  11. class AnyStorageBase {
  12. public:
  13.     virtual void Print(ostream& out) const = 0;
  14.     virtual ~AnyStorageBase() = default;
  15. };
  16.  
  17. template <typename T_outside>
  18. class AnyStorage : public AnyStorageBase {
  19. public:
  20.     template <typename T_inside>
  21.     AnyStorage(T_inside&& data) : data_(std::forward<T_inside>(data)) {}
  22.  
  23.     void Print(ostream& out) const override {out << data_;}
  24.  
  25. private:
  26.     T_outside data_;
  27. };
  28.  
  29. class Any {
  30. public:
  31.     template <typename S>
  32.     Any(S&& value) {
  33.         using Initial = remove_reference_t<S>;
  34.         any_data_ = make_unique<AnyStorage<Initial>>(std::forward<S>(value));
  35.     }
  36.  
  37.     void Print(ostream& out) const {
  38.         any_data_->Print(out);
  39.     }
  40.    
  41. private:
  42.     unique_ptr<AnyStorageBase> any_data_;
  43. };
  44.  
  45. class Dumper {
  46. public:
  47.     Dumper() {
  48.         std::cout << "construct"sv << std::endl;
  49.     }
  50.    
  51.     ~Dumper() {
  52.         std::cout << "destruct"sv << std::endl;
  53.     }
  54.    
  55.     Dumper(const Dumper&) {
  56.         std::cout << "copy"sv << std::endl;
  57.     }
  58.    
  59.     Dumper(Dumper&&) {
  60.         std::cout << "move"sv << std::endl;
  61.     }
  62.    
  63.     Dumper& operator=(const Dumper&) {
  64.         std::cout << "= copy"sv << std::endl;
  65.         return *this;
  66.     }
  67.    
  68.     Dumper& operator=(Dumper&&) {
  69.         std::cout << "= move"sv << std::endl;
  70.         return *this;
  71.     }
  72.    
  73. };
  74.  
  75. ostream& operator<<(ostream& out, const Any& arg) {
  76.     arg.Print(out);
  77.     return out;
  78. }
  79.  
  80. ostream& operator<<(ostream& out, const Dumper&) {
  81.     return out;
  82. }
  83.  
  84. int main() {
  85.     Any any_int(42);
  86.     Any any_string("abc"s);
  87.  
  88.     cout << any_int << endl << any_string << endl;
  89.  
  90.     Any any_dumper_temp{ Dumper() };
  91.  
  92.     Dumper auto_dumper;
  93.     Any any_dumper_auto(auto_dumper);
  94. }
Advertisement
Add Comment
Please, Sign In to add comment