fork download
  1. #include <type_traits>
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. template<typename T, typename ...U>
  6. auto time_function(T&& func, U&& ...args)
  7. -> typename enable_if<is_same<decltype(func(args...)), void>::value>::type
  8. {
  9. std::cout<<"timing void function"<<std::endl;
  10. std::forward<T>(func)(std::forward<U>(args)...);
  11.  
  12. std::cout<<"timing over"<<std::endl;
  13. }
  14.  
  15. template<typename T, typename ...U>
  16. auto time_function(T&& func, U&& ...args)
  17. -> typename enable_if<!is_same<decltype(func(args...)), void>::value, decltype(func(args...))>::type
  18. {
  19. std::cout<<"timing returning function"<<std::endl;
  20. auto val = std::forward<T>(func)(std::forward<U>(args)...);
  21.  
  22. std::cout<<"timing over"<<std::endl;
  23.  
  24. return val;
  25. }
  26.  
  27.  
  28. void foo(int){}
  29. int foo_return(int){return 0;}
  30.  
  31. int main()
  32. {
  33.  
  34. time_function(foo, 2);
  35. int i = time_function(&foo_return, 1); //this generates an error
  36. std::cout<<i<<std::endl;
  37.  
  38. }
Success #stdin #stdout 0s 4372KB
stdin
Standard input is empty
stdout
timing void function
timing over
timing returning function
timing over
0