// Test1.cpp: определяет точку входа для консольного приложения.
//
#include <memory>
#include <utility>
#include <functional>
template <typename T>
struct Callable;
template <typename R, typename... Args>
struct Callable <R(Args...)>
{
virtual R operator () (Args&&...) {}
};
template <typename T>
class Function;
template <typename R, typename... Args>
class Function<R(Args...)>
{
typedef std::unique_ptr <Callable<R(Args...)>> Ptr;
Ptr ptr;
template <typename T>
class Realisation : public Callable<R(Args...)>
{
T t;
public :
R operator () (Args&&... args)
{
return t(std::forward<Args>(args)...);
}
Realisation () {}
Realisation(T&& at) : t(std::move(at))
{}
};
public :
R operator () (Args&&... args)
{
return ptr->operator () (std::forward<Args>(args)...);
}
Function ()
{}
template <typename T>
Function (T&& t): ptr(std::make_unique<Realisation<T>>(std::move(t)))
{}
};
int main()
{
Function<void(const char*)> f = [] (const char* a) { printf("%s\n", a); };
f("Hello, world!");
getchar();
return 0;
}
Ly8gVGVzdDEuY3BwOiDQvtC/0YDQtdC00LXQu9GP0LXRgiDRgtC+0YfQutGDINCy0YXQvtC00LAg0LTQu9GPINC60L7QvdGB0L7Qu9GM0L3QvtCz0L4g0L/RgNC40LvQvtC20LXQvdC40Y8uCi8vCiNpbmNsdWRlIDxtZW1vcnk+CiNpbmNsdWRlIDx1dGlsaXR5PgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPiAKc3RydWN0IENhbGxhYmxlOwoKdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lLi4uIEFyZ3M+IApzdHJ1Y3QgQ2FsbGFibGUgPFIoQXJncy4uLik+CnsKCXZpcnR1YWwgUiBvcGVyYXRvciAoKSAoQXJncyYmLi4uKSB7fQp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IApjbGFzcyBGdW5jdGlvbjsKCnRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZS4uLiBBcmdzPiAKY2xhc3MgRnVuY3Rpb248UihBcmdzLi4uKT4KewoJdHlwZWRlZiBzdGQ6OnVuaXF1ZV9wdHIgPENhbGxhYmxlPFIoQXJncy4uLik+PiBQdHI7CglQdHIgcHRyOwoKCXRlbXBsYXRlIDx0eXBlbmFtZSBUPgoJY2xhc3MgUmVhbGlzYXRpb24gOiBwdWJsaWMgQ2FsbGFibGU8UihBcmdzLi4uKT4KCXsKCQlUIHQ7CglwdWJsaWMgOgoJCVIgb3BlcmF0b3IgKCkgKEFyZ3MmJi4uLiBhcmdzKQoJCXsKCQkJcmV0dXJuIHQoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKCQl9CgoJCVJlYWxpc2F0aW9uICgpIHt9CgoJCVJlYWxpc2F0aW9uKFQmJiBhdCkgOiB0KHN0ZDo6bW92ZShhdCkpIAoJCXt9Cgl9OwoKcHVibGljIDoKCVIgb3BlcmF0b3IgKCkgKEFyZ3MmJi4uLiBhcmdzKQoJewoJCXJldHVybiBwdHItPm9wZXJhdG9yICgpIChzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOwoJfQoKCUZ1bmN0aW9uICgpIAoJe30KCgl0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KCUZ1bmN0aW9uIChUJiYgdCk6IHB0cihzdGQ6Om1ha2VfdW5pcXVlPFJlYWxpc2F0aW9uPFQ+PihzdGQ6Om1vdmUodCkpKQoJe30KfTsKCmludCBtYWluKCkKewkKCUZ1bmN0aW9uPHZvaWQoY29uc3QgY2hhciopPiBmID0gW10gKGNvbnN0IGNoYXIqIGEpIHsgcHJpbnRmKCIlc1xuIiwgYSk7IH07CglmKCJIZWxsbywgd29ybGQhIik7CgoJZ2V0Y2hhcigpOwogICAgcmV0dXJuIDA7Cn0KCg==