#include <iostream>
struct X
{
template <typename F>
auto accept(F && f)
{
return [this, &f](auto &&... args) {
return f(this, std::forward<decltype(args)>(args)...); };
}
virtual void foo() const { std::cout << "base\n"; }
};
struct Y : X
{
void foo() const override { std::cout << "derived\n"; }
};
int main()
{
Y y;
X * p = &y;
(p->*(&X::foo))();
p->accept([](X * that){that->X::foo();});
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IFgKewoJdGVtcGxhdGUgPHR5cGVuYW1lIEY+CglhdXRvIGFjY2VwdChGICYmIGYpCgl7CgkJcmV0dXJuIFt0aGlzLCAmZl0oYXV0byAmJi4uLiBhcmdzKSB7CgkJCXJldHVybiBmKHRoaXMsIHN0ZDo6Zm9yd2FyZDxkZWNsdHlwZShhcmdzKT4oYXJncykuLi4pOyB9OwoJfQoKCXZpcnR1YWwgdm9pZCBmb28oKSBjb25zdCB7IHN0ZDo6Y291dCA8PCAiYmFzZVxuIjsgfQp9OwoKc3RydWN0IFkgOiBYCnsKCXZvaWQgZm9vKCkgY29uc3Qgb3ZlcnJpZGUgeyBzdGQ6OmNvdXQgPDwgImRlcml2ZWRcbiI7IH0KfTsKCgppbnQgbWFpbigpCnsKCVkgeTsKCVggKiBwID0gJnk7CgkKCShwLT4qKCZYOjpmb28pKSgpOwoJCglwLT5hY2NlcHQoW10oWCAqIHRoYXQpe3RoYXQtPlg6OmZvbygpO30pOwp9