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