fork download
  1. #include <chrono>
  2. #include <iostream>
  3. #include <functional>
  4.  
  5. auto measure = [](auto&& function) -> decltype(auto)
  6. {
  7. return [=](auto&&... parameters) mutable -> decltype(auto) {
  8.  
  9. const std::chrono::steady_clock::time_point startTimePoint =
  10. std::chrono::steady_clock::now();
  11.  
  12. decltype(auto) result = function(std::forward<decltype(parameters)>(parameters)...);
  13.  
  14. const std::chrono::steady_clock::time_point stopTimePoint =
  15. std::chrono::steady_clock::now();
  16.  
  17. const std::chrono::duration<double> timeSpan = std::chrono::duration_cast<
  18. std::chrono::duration<double>>(stopTimePoint - startTimePoint);
  19.  
  20. std::cout << "Computation took " << timeSpan.count()
  21. << " seconds." << std::endl;
  22.  
  23. return result;
  24. };
  25. };
  26.  
  27. class Test
  28. {
  29. public:
  30.  
  31. int& computation(double dummy)
  32. {
  33. static int x = 123;
  34.  
  35. std::cout << "Received " << dummy << ". Computing..." << &x << std::endl;
  36.  
  37. return x;
  38. }
  39. };
  40.  
  41. int main(int, char**)
  42. {
  43. Test instance;
  44.  
  45. auto function = std::bind(&Test::computation, instance, std::placeholders::_1);
  46.  
  47. decltype(auto) result = measure(function)(1.0);
  48.  
  49. std::cout << "Result: " << result << " " << &result << std::endl;
  50.  
  51. return 0;
  52. }
Success #stdin #stdout 0s 15232KB
stdin
Standard input is empty
stdout
Received 1. Computing...0x602088
Computation took 4.281e-05 seconds.
Result: 123 0x602088