#include <iostream>
template <typename Function>
class storage
{
public:
storage(const Function & function) : m_function(function)
{
std::cout << m_function(1) << '\n';
}
storage(Function && function) : m_function(std::move(function))
{
std::cout << m_function(1) << '\n';
}
private:
Function m_function;
};
int f(int x)
{
return x + 1;
}
int main()
{
storage<int(*)(int)> storage_f_ptr(f);
auto g = [](int y) { return 11*y; };
storage<decltype(g)> storage_g_lambda(g);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPgpjbGFzcyBzdG9yYWdlCnsKcHVibGljOgogICAgc3RvcmFnZShjb25zdCBGdW5jdGlvbiAmIGZ1bmN0aW9uKSA6IG1fZnVuY3Rpb24oZnVuY3Rpb24pCiAgICB7CgkJc3RkOjpjb3V0IDw8IG1fZnVuY3Rpb24oMSkgPDwgJ1xuJzsKCX0KICAgIAoJc3RvcmFnZShGdW5jdGlvbiAmJiBmdW5jdGlvbikgOiBtX2Z1bmN0aW9uKHN0ZDo6bW92ZShmdW5jdGlvbikpCgl7CgkJc3RkOjpjb3V0IDw8IG1fZnVuY3Rpb24oMSkgPDwgJ1xuJzsKCX0KCnByaXZhdGU6CglGdW5jdGlvbiBtX2Z1bmN0aW9uOwp9OwoKaW50IGYoaW50IHgpCnsKCXJldHVybiB4ICsgMTsKfQoKaW50IG1haW4oKQp7CglzdG9yYWdlPGludCgqKShpbnQpPiBzdG9yYWdlX2ZfcHRyKGYpOwoJCglhdXRvIGcgPSBbXShpbnQgeSkgeyByZXR1cm4gMTEqeTsgfTsKCXN0b3JhZ2U8ZGVjbHR5cGUoZyk+IHN0b3JhZ2VfZ19sYW1iZGEoZyk7Cgp9Cg==