#include <iostream>
void doSomething (int x) {std::cout << "Do something with " << x << std::endl;}
struct Base {
virtual int foo() const {return 5;}
virtual int goo() const {return 6;}
virtual int hoo() const {return 7;}
void noTemplatePattern() const {
Base(*this).templatePattern();
}
void templatePattern() const {
// Code A
if (foo() < 6) {
// Code B
}
doSomething (goo());
// Code C
if (hoo() > 10) {
// Code D
}
}
};
struct Derived : Base {
virtual int foo() const override {return 12;}
virtual int goo() const override {return 13;}
virtual int hoo() const override {return 14;}
};
int main() {
Derived d;
d.noTemplatePattern();
d.templatePattern();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdm9pZCBkb1NvbWV0aGluZyAoaW50IHgpIHtzdGQ6OmNvdXQgPDwgIkRvIHNvbWV0aGluZyB3aXRoICIgPDwgeCA8PCBzdGQ6OmVuZGw7fQoKc3RydWN0IEJhc2UgewogICAgdmlydHVhbCBpbnQgZm9vKCkgY29uc3Qge3JldHVybiA1O30KICAgIHZpcnR1YWwgaW50IGdvbygpIGNvbnN0IHtyZXR1cm4gNjt9CiAgICB2aXJ0dWFsIGludCBob28oKSBjb25zdCB7cmV0dXJuIDc7fQogICAgdm9pZCBub1RlbXBsYXRlUGF0dGVybigpIGNvbnN0IHsKICAgICAgICBCYXNlKCp0aGlzKS50ZW1wbGF0ZVBhdHRlcm4oKTsKICAgIH0KICAgIHZvaWQgdGVtcGxhdGVQYXR0ZXJuKCkgY29uc3QgewogICAgICAgIC8vIENvZGUgQQogICAgICAgIGlmIChmb28oKSA8IDYpIHsKICAgICAgICAgICAgLy8gQ29kZSBCCiAgICAgICAgfQogICAgICAgIGRvU29tZXRoaW5nIChnb28oKSk7CiAgICAgICAgLy8gQ29kZSBDCiAgICAgICAgaWYgKGhvbygpID4gMTApIHsKICAgICAgICAgICAgLy8gQ29kZSBECiAgICAgICAgfQogICAgfQp9OwoKc3RydWN0IERlcml2ZWQgOiBCYXNlIHsKICAgIHZpcnR1YWwgaW50IGZvbygpIGNvbnN0IG92ZXJyaWRlIHtyZXR1cm4gMTI7fQogICAgdmlydHVhbCBpbnQgZ29vKCkgY29uc3Qgb3ZlcnJpZGUge3JldHVybiAxMzt9CiAgICB2aXJ0dWFsIGludCBob28oKSBjb25zdCBvdmVycmlkZSB7cmV0dXJuIDE0O30KfTsKCmludCBtYWluKCkgewogICAgRGVyaXZlZCBkOwogICAgZC5ub1RlbXBsYXRlUGF0dGVybigpOwogICAgZC50ZW1wbGF0ZVBhdHRlcm4oKTsKfQo=