#include <iostream>
void doSomething (int x) {std::cout << "Do something with " << x << std::endl;}
struct Base {
virtual int foo() const {return foo(std::false_type());}
virtual int goo() const {return goo(std::false_type());}
virtual int hoo() const {return hoo(std::false_type());}
void noTemplatePattern() const { doIt (std::false_type()); }
void templatePattern() const { doIt (std::true_type()); }
private:
template <typename T>
void doIt (T t) const {
// Code A
if (foo(t) < 6) {
// Code B
}
doSomething (goo(t));
// Code C
if (hoo(t) > 10) {
// Code D
}
}
int foo(std::false_type) const {return 5;}
int goo(std::false_type) const {return 6;}
int hoo(std::false_type) const {return 7;}
int foo(std::true_type) const {return foo();}
int goo(std::true_type) const {return goo();}
int hoo(std::true_type) const {return hoo();}
};
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();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdm9pZCBkb1NvbWV0aGluZyAoaW50IHgpIHtzdGQ6OmNvdXQgPDwgIkRvIHNvbWV0aGluZyB3aXRoICIgPDwgeCA8PCBzdGQ6OmVuZGw7fQoKc3RydWN0IEJhc2UgewogICAgdmlydHVhbCBpbnQgZm9vKCkgY29uc3Qge3JldHVybiBmb28oc3RkOjpmYWxzZV90eXBlKCkpO30KICAgIHZpcnR1YWwgaW50IGdvbygpIGNvbnN0IHtyZXR1cm4gZ29vKHN0ZDo6ZmFsc2VfdHlwZSgpKTt9CiAgICB2aXJ0dWFsIGludCBob28oKSBjb25zdCB7cmV0dXJuIGhvbyhzdGQ6OmZhbHNlX3R5cGUoKSk7fQoKICAgIHZvaWQgbm9UZW1wbGF0ZVBhdHRlcm4oKSBjb25zdCB7IGRvSXQgKHN0ZDo6ZmFsc2VfdHlwZSgpKTsgfQogICAgdm9pZCB0ZW1wbGF0ZVBhdHRlcm4oKSBjb25zdCB7IGRvSXQgKHN0ZDo6dHJ1ZV90eXBlKCkpOyB9Cgpwcml2YXRlOgogICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiAgICB2b2lkIGRvSXQgKFQgdCkgY29uc3QgewogICAgICAgIC8vIENvZGUgQQogICAgICAgIGlmIChmb28odCkgPCA2KSB7CiAgICAgICAgICAgIC8vIENvZGUgQgogICAgICAgIH0KICAgICAgICBkb1NvbWV0aGluZyAoZ29vKHQpKTsKICAgICAgICAvLyBDb2RlIEMKICAgICAgICBpZiAoaG9vKHQpID4gMTApIHsKICAgICAgICAgICAgLy8gQ29kZSBECiAgICAgICAgfQogICAgfQogICAgaW50IGZvbyhzdGQ6OmZhbHNlX3R5cGUpIGNvbnN0IHtyZXR1cm4gNTt9CiAgICBpbnQgZ29vKHN0ZDo6ZmFsc2VfdHlwZSkgY29uc3Qge3JldHVybiA2O30KICAgIGludCBob28oc3RkOjpmYWxzZV90eXBlKSBjb25zdCB7cmV0dXJuIDc7fQogICAgaW50IGZvbyhzdGQ6OnRydWVfdHlwZSkgY29uc3Qge3JldHVybiBmb28oKTt9CiAgICBpbnQgZ29vKHN0ZDo6dHJ1ZV90eXBlKSBjb25zdCB7cmV0dXJuIGdvbygpO30KICAgIGludCBob28oc3RkOjp0cnVlX3R5cGUpIGNvbnN0IHtyZXR1cm4gaG9vKCk7fQp9OwoKc3RydWN0IERlcml2ZWQgOiBCYXNlIHsKICAgIHZpcnR1YWwgaW50IGZvbygpIGNvbnN0IG92ZXJyaWRlIHtyZXR1cm4gMTI7fQogICAgdmlydHVhbCBpbnQgZ29vKCkgY29uc3Qgb3ZlcnJpZGUge3JldHVybiAxMzt9CiAgICB2aXJ0dWFsIGludCBob28oKSBjb25zdCBvdmVycmlkZSB7cmV0dXJuIDE0O30KfTsKCmludCBtYWluKCkgewogICAgRGVyaXZlZCBkOwogICAgZC5ub1RlbXBsYXRlUGF0dGVybigpOwogICAgZC50ZW1wbGF0ZVBhdHRlcm4oKTsKfQo=