#include <utility> // for std::forward
#include <iostream>


static int total = 0;
static void add(int n)
{
	std::cout << "Adding " << n << std::endl;
	total += n;
}

static void display(const char message[])
{
	std::cout << message << ": " << total << std::endl;
}

template <class Callable, typename... ArgTypes>
void* Call(Callable native_func, ArgTypes&&... args) noexcept
{
	std::clog << "in Call" << std::endl;
	return native_func(std::forward<ArgTypes>(args)...);
}

static void* test_lambda(int delta)
{
	std::clog << "in test_lambda" << std::endl;
	return Call([=](int delta)
	{
		std::clog << "in lambda" << std::endl;
		add(delta);
		display("total");
		return nullptr;
	}, delta);
}

int main(int argc, char* argv[])
{
	std::clog << "start" << std::endl;
	test_lambda(5);
	std::clog << "after first call" << std::endl;
	test_lambda(20);
	std::clog << "after second call" << std::endl;
	test_lambda(-256);
	std::clog << "after third call" << std::endl;
        return total != -231;
}