#include <iostream>
class Interface
{
public:
virtual void someMethod() = 0;
virtual void someOtherMethod() const = 0;
};
struct Impl : Interface {
virtual void someMethod() { std::cout << "some method\n"; }
virtual void someOtherMethod() const { std::cout << "some other method\n"; }
};
struct Proxy : Interface{
Proxy(Interface* i) : i(i) {}
Interface* i;
void someMethod() { std::cout << "log "; i->someMethod(); }
void someOtherMethod() const { std::cout << "log "; i->someOtherMethod(); }
};
class ConstProxy {
Proxy p;
public:
ConstProxy(Interface const* i) : p(const_cast<Interface*>(i)) {}
void someOtherMethod() const { p.someOtherMethod(); }
operator Interface const& () { return p; } // imitiert "extends const Interface"
};
void foo( Interface& i )
{
i.someOtherMethod();
}
void foo2( Interface const& i )
{
i.someOtherMethod();
}
int main()
{
Impl i;
ConstProxy cp(&i);
//foo(cp);
foo2(cp);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgSW50ZXJmYWNlCnsKcHVibGljOgogICAgdmlydHVhbCB2b2lkIHNvbWVNZXRob2QoKSA9IDA7CiAgICB2aXJ0dWFsIHZvaWQgc29tZU90aGVyTWV0aG9kKCkgY29uc3QgPSAwOwp9OwoKc3RydWN0IEltcGwgOiBJbnRlcmZhY2UgewogIHZpcnR1YWwgdm9pZCBzb21lTWV0aG9kKCkgeyBzdGQ6OmNvdXQgPDwgInNvbWUgbWV0aG9kXG4iOyB9CiAgdmlydHVhbCB2b2lkIHNvbWVPdGhlck1ldGhvZCgpIGNvbnN0IHsgc3RkOjpjb3V0IDw8ICJzb21lIG90aGVyIG1ldGhvZFxuIjsgfQp9OwpzdHJ1Y3QgUHJveHkgOiBJbnRlcmZhY2V7CiAgUHJveHkoSW50ZXJmYWNlKiBpKSA6IGkoaSkge30KICBJbnRlcmZhY2UqIGk7CiAgdm9pZCBzb21lTWV0aG9kKCkgeyBzdGQ6OmNvdXQgPDwgImxvZyAiOyBpLT5zb21lTWV0aG9kKCk7IH0KICB2b2lkIHNvbWVPdGhlck1ldGhvZCgpIGNvbnN0IHsgc3RkOjpjb3V0IDw8ICJsb2cgIjsgaS0+c29tZU90aGVyTWV0aG9kKCk7IH0KfTsKY2xhc3MgQ29uc3RQcm94eSB7CiAgUHJveHkgcDsKcHVibGljOgogIENvbnN0UHJveHkoSW50ZXJmYWNlIGNvbnN0KiBpKSA6IHAoY29uc3RfY2FzdDxJbnRlcmZhY2UqPihpKSkge30KICB2b2lkIHNvbWVPdGhlck1ldGhvZCgpIGNvbnN0IHsgcC5zb21lT3RoZXJNZXRob2QoKTsgfQogIG9wZXJhdG9yIEludGVyZmFjZSBjb25zdCYgKCkgeyByZXR1cm4gcDsgfSAgLy8gaW1pdGllcnQgImV4dGVuZHMgY29uc3QgSW50ZXJmYWNlIgp9OwoKdm9pZCBmb28oIEludGVyZmFjZSYgaSApCnsKICBpLnNvbWVPdGhlck1ldGhvZCgpOwp9CnZvaWQgZm9vMiggSW50ZXJmYWNlIGNvbnN0JiBpICkKewogIGkuc29tZU90aGVyTWV0aG9kKCk7Cn0KCmludCBtYWluKCkKewogIEltcGwgaTsKICBDb25zdFByb3h5IGNwKCZpKTsKICAvL2ZvbyhjcCk7CiAgZm9vMihjcCk7Cn0K