#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;
}