Advertisement
Guest User

About non-intrusive polymorphism

a guest
May 23rd, 2015
288
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.96 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <ostream>
  3. #include <iostream>
  4. #include <vector>
  5.  
  6. void f(int i) {
  7.     std::cout << "int: " << i << std::endl;
  8. };
  9.  
  10. void f(const std::string& str) {
  11.     std::cout << "std::string: " << str << std::endl;
  12. }
  13.  
  14. struct Poly {
  15. public:
  16.     template<typename T>
  17.     Poly(T&& data) :
  18.         ptr(new derived<T>(std::forward<T>(data))) {
  19.     }
  20.  
  21.     void f() {
  22.         ptr->f();
  23.     }
  24.  
  25. private:
  26.     struct base {
  27.         virtual void f() = 0;
  28.         virtual ~base() = default;
  29.     };
  30.  
  31.     template<typename T>
  32.     struct derived : base {
  33.         T data;
  34.  
  35.         derived(T&& data) :
  36.             data(std::forward<T>(data)) {
  37.         }
  38.  
  39.         void f() override {
  40.             ::f(data);
  41.         }
  42.     };
  43.  
  44.     base* ptr;
  45. };
  46.  
  47. int main(int argc, char** argv) {
  48.     std::vector<Poly> objects;
  49.  
  50.     objects.emplace_back(1);
  51.     objects.emplace_back("hello world!");
  52.  
  53.     for (Poly& o : objects) {
  54.         o.f();
  55.     }
  56. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement