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