#include <chrono>
#include <iostream>
#include <functional>
auto measure = [](auto&& function) -> decltype(auto)
{
return [=](auto&&... parameters) mutable -> decltype(auto) {
const std::chrono::steady_clock::time_point startTimePoint =
std::chrono::steady_clock::now();
decltype(auto) result = 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 result;
};
};
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;
}
I2luY2x1ZGUgPGNocm9ubz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCmF1dG8gbWVhc3VyZSA9IFtdKGF1dG8mJiBmdW5jdGlvbikgLT4gZGVjbHR5cGUoYXV0bykKewogICAgcmV0dXJuIFs9XShhdXRvJiYuLi4gcGFyYW1ldGVycykgbXV0YWJsZSAtPiBkZWNsdHlwZShhdXRvKSB7CiAgICAKICAgICAgICBjb25zdCBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50IHN0YXJ0VGltZVBvaW50ID0gCiAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOwogICAgICAgICAgICAKICAgIAlkZWNsdHlwZShhdXRvKSByZXN1bHQgPSBmdW5jdGlvbihzdGQ6OmZvcndhcmQ8ZGVjbHR5cGUocGFyYW1ldGVycyk+KHBhcmFtZXRlcnMpLi4uKTsKICAgIAkKICAgIAljb25zdCBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50IHN0b3BUaW1lUG9pbnQgPQogICAgCQlzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKCiAgICAJY29uc3Qgc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZT4gdGltZVNwYW4gPSBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDwKICAgIAlzdGQ6OmNocm9ubzo6ZHVyYXRpb248ZG91YmxlPj4oc3RvcFRpbWVQb2ludCAtIHN0YXJ0VGltZVBvaW50KTsKCiAgICAJc3RkOjpjb3V0IDw8ICJDb21wdXRhdGlvbiB0b29rICIgPDwgdGltZVNwYW4uY291bnQoKQogICAgCQkJPDwgIiBzZWNvbmRzLiIgPDwgc3RkOjplbmRsOwoKICAgIAlyZXR1cm4gcmVzdWx0OwoJfTsKfTsKCmNsYXNzIFRlc3QKewpwdWJsaWM6CgogICAgaW50JiBjb21wdXRhdGlvbihkb3VibGUgZHVtbXkpCiAgICB7CiAgICAgICAgc3RhdGljIGludCB4ID0gMTIzOwoKICAgICAgICBzdGQ6OmNvdXQgPDwgIlJlY2VpdmVkICIgPDwgZHVtbXkgPDwgIi4gQ29tcHV0aW5nLi4uIiA8PCAmeCA8PCBzdGQ6OmVuZGw7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHg7CiAgICB9Cn07CgppbnQgbWFpbihpbnQsIGNoYXIqKikKewogICAgVGVzdCBpbnN0YW5jZTsKCiAgICBhdXRvIGZ1bmN0aW9uID0gc3RkOjpiaW5kKCZUZXN0Ojpjb21wdXRhdGlvbiwgaW5zdGFuY2UsIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSk7CgogICAgZGVjbHR5cGUoYXV0bykgcmVzdWx0ID0gbWVhc3VyZShmdW5jdGlvbikoMS4wKTsKCiAgICBzdGQ6OmNvdXQgPDwgIlJlc3VsdDogIiA8PCByZXN1bHQgPDwgIiAiIDw8ICZyZXN1bHQgPDwgc3RkOjplbmRsOwoKICAgIHJldHVybiAwOwp9