fork download
  1. #include <memory>
  2. #include <functional>
  3.  
  4. //all done assuming interface is `void (*)()`
  5.  
  6. struct function_interface {
  7. virtual void operator()()=0;
  8. virtual std::unique_ptr<function_interface> copy()=0;
  9. };
  10. template<class T>
  11. class function_impl : public function_interface {
  12. T t;
  13. public:
  14. function_impl(T t_) : t(std::move(t_)) {};
  15. void operator()() {t();}
  16. virtual std::unique_ptr<function_interface> copy()
  17. {return std::unique_ptr<function_interface>(new function_impl(t));}
  18. };
  19.  
  20. class function {
  21. std::unique_ptr<function_interface> ptr;
  22. public:
  23. template<class T>
  24. function(T t) : ptr(new function_impl<T>(std::move(t))) {}
  25. function(const function& rhs) : ptr(rhs.ptr->copy()) {}
  26. function(function&& rhs) : ptr(std::move(rhs.ptr)) {}
  27. void operator()() {(*ptr)();}
  28. };
  29.  
  30. #include <iostream>
  31. struct oid {
  32. void operator()() {std::cout << "oid";}
  33. };
  34. void func() {std::cout << "function";}
  35.  
  36. int main() {
  37. function a(func);
  38. function b(a);
  39. b();
  40. function c((oid()));
  41. c();
  42. function d(c);
  43. d();
  44. }
Success #stdin #stdout 0s 3016KB
stdin
Standard input is empty
stdout
functionoidoid