#include <iostream>
#include <functional>
class foo
{
public:
void visitWith(std::function<void(foo&)> v) { v(*this); }
void visitWith(std::function<void(const foo&)> v) const { v(*this); }
};
int main()
{
foo f;
f.visitWith([&](foo&){ std::cout << "visited with non-const" << std::endl; });
f.visitWith([&](const foo&){ std::cout << "visited with const" << std::endl; });
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCmNsYXNzIGZvbwp7CnB1YmxpYzoKCXZvaWQgdmlzaXRXaXRoKHN0ZDo6ZnVuY3Rpb248dm9pZChmb28mKT4gdikgeyB2KCp0aGlzKTsgfQoJdm9pZCB2aXNpdFdpdGgoc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IGZvbyYpPiB2KSBjb25zdCB7IHYoKnRoaXMpOyB9Cn07CgppbnQgbWFpbigpCnsKCWZvbyBmOwoJZi52aXNpdFdpdGgoWyZdKGZvbyYpeyBzdGQ6OmNvdXQgPDwgInZpc2l0ZWQgd2l0aCBub24tY29uc3QiIDw8IHN0ZDo6ZW5kbDsgfSk7CglmLnZpc2l0V2l0aChbJl0oY29uc3QgZm9vJil7IHN0ZDo6Y291dCA8PCAidmlzaXRlZCB3aXRoIGNvbnN0IiA8PCBzdGQ6OmVuZGw7IH0pOwoJcmV0dXJuIDA7Cn0=