fork download
  1. #include <utility>
  2.  
  3. #define AUTO_RETURN( ... ) -> decltype(__VA_ARGS__) { return (__VA_ARGS__); }
  4.  
  5. struct base_tag {};
  6. struct derived_tag : base_tag {};
  7.  
  8. template< typename F,
  9. typename T1,
  10. typename...
  11. Args >
  12. auto invoke( derived_tag, F f, T1&& t1, Args&&... args )
  13. AUTO_RETURN( (std::forward<T1>(t1).*f)(std::forward<Args>(args)...) )
  14.  
  15. template< typename F,
  16. typename T1,
  17. typename... Args >
  18. auto invoke( base_tag, F f, T1 t1, Args&&... args )
  19. AUTO_RETURN( ((*t1).*f)(std::forward<Args>(args)...) )
  20.  
  21. template< typename F,
  22. typename T1 >
  23. auto invoke( base_tag, F f, T1&& t1 )
  24. AUTO_RETURN( std::forward<T1>(t1).*f )
  25.  
  26. template< typename F,
  27. typename T1 >
  28. auto invoke( base_tag, F f, T1 t1 )
  29. AUTO_RETURN( (*t1).*f )
  30.  
  31. template< typename F, typename... Args >
  32. auto invoke( base_tag, F&& f, Args&&... args )
  33. {
  34. return std::forward<F>(f)(std::forward<Args>(args)...);
  35. }
  36.  
  37. template< typename... Args >
  38. auto INVOKE( Args&&... args )
  39. {
  40. return invoke( derived_tag{}, std::forward<Args>(args)... );
  41. }
  42.  
  43. struct wat { wat& operator*() { return *this; } void foo(){} };;
  44.  
  45. int main()
  46. {
  47. INVOKE(&wat::foo, wat{});
  48. }
  49.  
Success #stdin #stdout 0s 3292KB
stdin
Standard input is empty
stdout
Standard output is empty