Guest User

Untitled

a guest
Jan 22nd, 2019
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.07 KB | None | 0 0
  1. template <typename T>
  2. class function;
  3.  
  4. template <typename Return, typename... Args>
  5. class function<Return(Args...)>
  6. {
  7. public:
  8. function() {}
  9.  
  10. template <class T, typename = typename enable_if<is_invocable<T, Args...>::value>::type>
  11. function(T functor)
  12. {
  13. m_func = [](const void* user, Args... args) -> Return
  14. {
  15. const T& func = *static_cast<const T*>(user);
  16. return func(static_cast<Args&&>(args)...);
  17. };
  18.  
  19. m_dtor = [](void* user)
  20. {
  21. T& func = *static_cast<T*>(user);
  22. func.~T();
  23. };
  24.  
  25. static_assert(sizeof(T) <= sizeof(m_storage));
  26. new(m_storage) T(move(functor));
  27. }
  28.  
  29. ~function()
  30. {
  31. if(m_dtor) m_dtor(m_storage);
  32. }
  33.  
  34. Return operator()(Args... args) const
  35. {
  36. return m_func(m_storage, static_cast<Args&&>(args)...);
  37. }
  38.  
  39. explicit operator bool() { return m_func != nullptr; }
  40.  
  41. using Func = Return(*)(const void*, Args...); Func m_func = nullptr;
  42. using Dtor = void(*)(void*); Dtor m_dtor = nullptr;
  43. void* m_storage[8];
  44. };
Add Comment
Please, Sign In to add comment