#include <chrono>
#include <iostream>
#include <functional>
auto measure = [](auto&& function, auto&&... parameters) -> decltype(auto)
{
const std::chrono::steady_clock::time_point startTimePoint =
std::chrono::steady_clock::now();
decltype(auto) returnValue = std::forward<decltype(function)>(function)(
std::forward<decltype(parameters)>(parameters)...);
const std::chrono::steady_clock::time_point stopTimePoint =
std::chrono::steady_clock::now();
const std::chrono::duration<double> timeSpan = std::chrono::duration_cast<
std::chrono::duration<double>>(stopTimePoint - startTimePoint);
std::cout << "Computation took " << timeSpan.count()
<< " seconds." << std::endl;
return returnValue;
};
class Test
{
public:
int& computation(double dummy)
{
static int x = 123;
std::cout << "Received " << dummy << ". Computing..." << &x << std::endl;
return x;
}
};
int main(int, char**)
{
Test instance;
auto function = std::bind(&Test::computation, instance, std::placeholders::_1);
decltype(auto) result = measure(function, 1.0);
std::cout << "Result: " << result << " " << &result << std::endl;
return 0;
}
I2luY2x1ZGUgPGNocm9ubz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCmF1dG8gbWVhc3VyZSA9IFtdKGF1dG8mJiBmdW5jdGlvbiwgYXV0byYmLi4uIHBhcmFtZXRlcnMpIC0+IGRlY2x0eXBlKGF1dG8pCnsKICAgIGNvbnN0IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OnRpbWVfcG9pbnQgc3RhcnRUaW1lUG9pbnQgPQogICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CgogICAgZGVjbHR5cGUoYXV0bykgcmV0dXJuVmFsdWUgPSBzdGQ6OmZvcndhcmQ8ZGVjbHR5cGUoZnVuY3Rpb24pPihmdW5jdGlvbikoCiAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZDxkZWNsdHlwZShwYXJhbWV0ZXJzKT4ocGFyYW1ldGVycykuLi4pOwoKICAgIGNvbnN0IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OnRpbWVfcG9pbnQgc3RvcFRpbWVQb2ludCA9CiAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKCiAgICBjb25zdCBzdGQ6OmNocm9ubzo6ZHVyYXRpb248ZG91YmxlPiB0aW1lU3BhbiA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PAogICAgc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZT4+KHN0b3BUaW1lUG9pbnQgLSBzdGFydFRpbWVQb2ludCk7CgogICAgc3RkOjpjb3V0IDw8ICJDb21wdXRhdGlvbiB0b29rICIgPDwgdGltZVNwYW4uY291bnQoKQogICAgPDwgIiBzZWNvbmRzLiIgPDwgc3RkOjplbmRsOwoKICAgIHJldHVybiByZXR1cm5WYWx1ZTsKfTsKCmNsYXNzIFRlc3QKewpwdWJsaWM6CgogICAgaW50JiBjb21wdXRhdGlvbihkb3VibGUgZHVtbXkpCiAgICB7CiAgICAgICAgc3RhdGljIGludCB4ID0gMTIzOwoKICAgICAgICBzdGQ6OmNvdXQgPDwgIlJlY2VpdmVkICIgPDwgZHVtbXkgPDwgIi4gQ29tcHV0aW5nLi4uIiA8PCAmeCA8PCBzdGQ6OmVuZGw7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHg7CiAgICB9Cn07CgppbnQgbWFpbihpbnQsIGNoYXIqKikKewogICAgVGVzdCBpbnN0YW5jZTsKCiAgICBhdXRvIGZ1bmN0aW9uID0gc3RkOjpiaW5kKCZUZXN0Ojpjb21wdXRhdGlvbiwgaW5zdGFuY2UsIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSk7CgogICAgZGVjbHR5cGUoYXV0bykgcmVzdWx0ID0gbWVhc3VyZShmdW5jdGlvbiwgMS4wKTsKCiAgICBzdGQ6OmNvdXQgPDwgIlJlc3VsdDogIiA8PCByZXN1bHQgPDwgIiAiIDw8ICZyZXN1bHQgPDwgc3RkOjplbmRsOwoKICAgIHJldHVybiAwOwp9