class Base {
public:
virtual void func1() = 0;
virtual void func2() = 0;
virtual ~Base(){}
};
#include <iostream>
#include <memory>
class Derived : public Base
{
struct F1Strategy {
virtual void f1Impl() = 0;
virtual ~F1Strategy() {}
};
struct Impl1 : F1Strategy {
void f1Impl() override { std::cout << "one!\n"; }
};
struct Impl2 : F1Strategy {
void f1Impl() override { std::cout << "two?\n"; }
};
std::unique_ptr<F1Strategy> f1Strategy;
public:
Derived()
: f1Strategy(new Impl1())
{}
void func1() override { f1Strategy->f1Impl(); }
void func2() override {
static std::unique_ptr<F1Strategy> otherStrategy(new Impl2());
f1Strategy.swap(otherStrategy);
}
};
int main() {
std::unique_ptr<Base> pb(new Derived());
pb->func1(); // ==> one!
pb->func2(); //swap
pb->func1(); // ==> two?
pb->func1(); // ==> two?
pb->func2(); //swap
pb->func1(); // ==> one!
}
Y2xhc3MgQmFzZSB7CnB1YmxpYzoKICAgIHZpcnR1YWwgdm9pZCBmdW5jMSgpID0gMDsKICAgIHZpcnR1YWwgdm9pZCBmdW5jMigpID0gMDsKCiAgICB2aXJ0dWFsIH5CYXNlKCl7fQp9OwoKI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgoKY2xhc3MgRGVyaXZlZCA6IHB1YmxpYyBCYXNlCnsKICBzdHJ1Y3QgRjFTdHJhdGVneSB7IAogICAgdmlydHVhbCB2b2lkIGYxSW1wbCgpID0gMDsgCiAgICB2aXJ0dWFsIH5GMVN0cmF0ZWd5KCkge30KICB9OwoKICBzdHJ1Y3QgSW1wbDEgOiBGMVN0cmF0ZWd5IHsKICAgIHZvaWQgZjFJbXBsKCkgb3ZlcnJpZGUgeyBzdGQ6OmNvdXQgPDwgIm9uZSFcbiI7IH0KICB9OwoKICBzdHJ1Y3QgSW1wbDIgOiBGMVN0cmF0ZWd5IHsKICAgIHZvaWQgZjFJbXBsKCkgb3ZlcnJpZGUgeyBzdGQ6OmNvdXQgPDwgInR3bz9cbiI7IH0KICB9OyAgICAKICAKICBzdGQ6OnVuaXF1ZV9wdHI8RjFTdHJhdGVneT4gZjFTdHJhdGVneTsKcHVibGljOgogIERlcml2ZWQoKSAKICAgIDogZjFTdHJhdGVneShuZXcgSW1wbDEoKSkKICB7fQoKICB2b2lkIGZ1bmMxKCkgb3ZlcnJpZGUgeyBmMVN0cmF0ZWd5LT5mMUltcGwoKTsgfQogIAogIHZvaWQgZnVuYzIoKSBvdmVycmlkZSB7IAogICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxGMVN0cmF0ZWd5PiBvdGhlclN0cmF0ZWd5KG5ldyBJbXBsMigpKTsKICAgIGYxU3RyYXRlZ3kuc3dhcChvdGhlclN0cmF0ZWd5KTsKICB9Cn07CgppbnQgbWFpbigpIHsKICBzdGQ6OnVuaXF1ZV9wdHI8QmFzZT4gcGIobmV3IERlcml2ZWQoKSk7CiAgcGItPmZ1bmMxKCk7ICAvLyAgPT0+IG9uZSEKICBwYi0+ZnVuYzIoKTsgIC8vc3dhcAogIHBiLT5mdW5jMSgpOyAgLy8gID09PiB0d28/CiAgcGItPmZ1bmMxKCk7ICAvLyAgPT0+IHR3bz8KICBwYi0+ZnVuYzIoKTsgIC8vc3dhcAogIHBiLT5mdW5jMSgpOyAgLy8gID09PiBvbmUhCn0KCg==