Advertisement
kutuzzzov

Урок 5 совершенный способ

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