#include <iostream>
#include <functional>
struct interface {
virtual int hello() = 0;
};
struct implementation : public interface {
virtual int hello() {
std::cout << "hello()\n";
return 42;
}
~implementation() {
std::cout << "~implementation()\n";
}
};
struct adapter {
interface* obj;
adapter(std::function<int()>&& func) {
struct lambda : public interface {
std::function<int()> func;
lambda(std::function<int()> func_): func(func_) { }
virtual int hello() {
return this->func();
}
};
this->obj = new lambda{func};
}
adapter(interface&& impl) {
this->obj = &impl;
}
};
int main() {
adapter a([]() { std::cout << "hello from lambda\n"; return 99; });
a.obj->hello();
adapter b{implementation()};
b.obj->hello();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnN0cnVjdCBpbnRlcmZhY2UgewoJdmlydHVhbCBpbnQgaGVsbG8oKSA9IDA7Cn07CgpzdHJ1Y3QgaW1wbGVtZW50YXRpb24gOiBwdWJsaWMgaW50ZXJmYWNlIHsKCXZpcnR1YWwgaW50IGhlbGxvKCkgewoJCXN0ZDo6Y291dCA8PCAiaGVsbG8oKVxuIjsKCQlyZXR1cm4gNDI7Cgl9Cgl+aW1wbGVtZW50YXRpb24oKSB7CgkJc3RkOjpjb3V0IDw8ICJ+aW1wbGVtZW50YXRpb24oKVxuIjsKCX0KfTsKCnN0cnVjdCBhZGFwdGVyIHsKCWludGVyZmFjZSogb2JqOwoJCglhZGFwdGVyKHN0ZDo6ZnVuY3Rpb248aW50KCk+JiYgZnVuYykgewoJCXN0cnVjdCBsYW1iZGEgOiBwdWJsaWMgaW50ZXJmYWNlIHsKCQkJc3RkOjpmdW5jdGlvbjxpbnQoKT4gZnVuYzsKCQkJbGFtYmRhKHN0ZDo6ZnVuY3Rpb248aW50KCk+IGZ1bmNfKTogZnVuYyhmdW5jXykgeyB9CgkJCXZpcnR1YWwgaW50IGhlbGxvKCkgewoJCQkJcmV0dXJuIHRoaXMtPmZ1bmMoKTsKCQkJfQoJCX07CgkJdGhpcy0+b2JqID0gbmV3IGxhbWJkYXtmdW5jfTsKCX0KCQoJYWRhcHRlcihpbnRlcmZhY2UmJiBpbXBsKSB7CgkJdGhpcy0+b2JqID0gJmltcGw7Cgl9Cn07CgppbnQgbWFpbigpIHsKCWFkYXB0ZXIgYShbXSgpIHsgc3RkOjpjb3V0IDw8ICJoZWxsbyBmcm9tIGxhbWJkYVxuIjsgcmV0dXJuIDk5OyB9KTsKCWEub2JqLT5oZWxsbygpOwoJCglhZGFwdGVyIGJ7aW1wbGVtZW50YXRpb24oKX07CgliLm9iai0+aGVsbG8oKTsKCglyZXR1cm4gMDsKfQ==