#include <iostream>
template <typename Derived, typename T> struct Foo {
void CallBar () {
static_cast<Derived*>(this)->Bar();
}
};
struct Baz : public Foo<Baz, int> {
void Bar () {
std::cout << "Bars everywhere, bitches.\n";
}
};
int main (int argc, char* argv[]) {
Baz baz;
baz.CallBar();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQsIHR5cGVuYW1lIFQ+IHN0cnVjdCBGb28gewogICAgCiAgICB2b2lkIENhbGxCYXIgKCkgewogICAgICAgIHN0YXRpY19jYXN0PERlcml2ZWQqPih0aGlzKS0+QmFyKCk7CiAgICB9Cn07CgpzdHJ1Y3QgQmF6IDogcHVibGljIEZvbzxCYXosIGludD4gewogICAgCiAgICB2b2lkIEJhciAoKSB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJCYXJzIGV2ZXJ5d2hlcmUsIGJpdGNoZXMuXG4iOwogICAgfQogICAgCn07CgppbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgewogICAgCiAgICBCYXogYmF6OwogICAgYmF6LkNhbGxCYXIoKTsKICAgIAp9