fork(3) download
  1. #include <iostream>
  2. #include <memory>
  3. #include <tuple>
  4.  
  5. template< class ReturnType, class... ParamTypes>
  6. struct move_function_base{
  7. virtual ReturnType callFunc(ParamTypes... p) = 0;
  8. };
  9.  
  10. template<class F, class ReturnType, class... ParamTypes>
  11. class move_function_imp : public move_function_base<ReturnType, ParamTypes...> {
  12.  
  13. typename std::remove_reference<F>::type f_;
  14.  
  15. public:
  16. virtual ReturnType callFunc(ParamTypes&&... p) override {
  17. return f_(std::forward<ParamTypes>(p)...);
  18. }
  19. explicit move_function_imp(const F& f) : f_(f) {}
  20. explicit move_function_imp(F&& f) : f_(std::move(f)) {}
  21.  
  22. move_function_imp() = delete;
  23. move_function_imp(const move_function_imp&) = delete;
  24. move_function_imp& operator=(const move_function_imp&) = delete;
  25. };
  26.  
  27.  
  28. template<class FuncType>
  29. struct move_function{};
  30.  
  31. template<class ReturnType, class... ParamTypes>
  32. struct move_function<ReturnType(ParamTypes...)>{
  33. std::unique_ptr<move_function_base<ReturnType,ParamTypes...>> ptr_;
  34.  
  35. move_function() = default;
  36. template<class F>
  37. move_function(F&& f) :
  38. ptr_(new move_function_imp<F, ReturnType,ParamTypes...>
  39. (std::forward<F>(f))){}
  40. move_function(move_function&& other) = default;
  41. move_function& operator=(move_function&& other) = default;
  42.  
  43. template<class... Args>
  44. ReturnType
  45. operator()(Args&& ...args)
  46. {
  47. return ptr_->callFunc(std::forward<Args>(args)...);
  48. }
  49.  
  50. explicit operator bool() const
  51. {
  52. return static_cast<bool>(ptr_);
  53. }
  54.  
  55. move_function(const move_function&) = delete;
  56. move_function& operator=(const move_function&) = delete;
  57. };
  58.  
  59. int main()
  60. {
  61. auto f = [](){std::cout << "Hello World" << std::endl;};
  62. auto f2 = move_function<void()>{f};
  63. return 0;
  64. }
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp: In instantiation of ‘class move_function_imp<main()::__lambda0&, void>’:
prog.cpp:39:30:   required from ‘move_function<ReturnType(ParamTypes ...)>::move_function(F&&) [with F = main()::__lambda0&; ReturnType = void; ParamTypes = {}]’
prog.cpp:62:38:   required from here
prog.cpp:20:12: error: ‘move_function_imp<F, ReturnType, ParamTypes>::move_function_imp(F&&) [with F = main()::__lambda0&; ReturnType = void; ParamTypes = {}]’ cannot be overloaded
   explicit move_function_imp(F&& f) : f_(std::move(f)) {}
            ^
prog.cpp:19:12: error: with ‘move_function_imp<F, ReturnType, ParamTypes>::move_function_imp(const F&) [with F = main()::__lambda0&; ReturnType = void; ParamTypes = {}]’
   explicit move_function_imp(const F& f) : f_(f) {}
            ^
prog.cpp:19:12: error: ‘move_function_imp<F, ReturnType, ParamTypes>::move_function_imp(const F&) [with F = main()::__lambda0&; ReturnType = void; ParamTypes = {}]’, declared using local type ‘main()::__lambda0’, is used but never defined [-fpermissive]
stdout
Standard output is empty