fork download
  1. // helper
  2. template<unsigned N>
  3. struct priority : priority<N-1>{};
  4. template<> struct priority<0>{};
  5.  
  6. // []foo would result in:
  7.  
  8. struct __unnamed__{
  9. template<class... Ts>
  10. auto operator()(Ts&&... vs)
  11. -> decltype(call(priority<5>{}, std::forward<Ts>(vs)...))
  12. {
  13. return call(priority<5>{}, std::forward<Ts>(vs)...);
  14. }
  15.  
  16. private:
  17. template<class C, class... Ts>
  18. auto call(priority<5>, C&& o, Ts&&... vs)
  19. -> decltype(std::forward<C>(o).foo(std::forward<Ts>(vs)...))
  20. {
  21. return std::forward<C>(o).foo(std::forward<Ts>(vs)...);
  22. }
  23.  
  24. template<class C, class... Ts>
  25. auto call(priority<4>, C&& o, Ts&&... vs)
  26. -> decltype(std::forward<C>(o)->foo(std::forward<Ts>(vs)...))
  27. {
  28. return std::forward<C>(o)->foo(std::forward<Ts>(vs)...);
  29. }
  30.  
  31. template<class C>
  32. auto call(priority<3>, C&& o)
  33. -> decltype(std::forward<C>(o).foo)
  34. {
  35. return std::forward<C>(o).foo;
  36. }
  37.  
  38. template<class C>
  39. auto call(priority<2>, C&& o)
  40. -> decltype(std::forward<C>(o)->foo)
  41. {
  42. return std::forward<C>(o)->foo;
  43. }
  44.  
  45. template<class... Ts>
  46. auto call(priority<1>, Ts&&... vs)
  47. -> decltype(foo(std::forward<Ts>(vs)...))
  48. {
  49. return foo(std::forward<Ts>(vs)...);
  50. }
  51. };
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty