#include <iostream>
template<typename, int Value>
struct parent {
void foo() const {
std::clog << "parent: " << Value << std::endl;
}
};
template<typename, int>
struct child;
template<int Value>
struct child<int, Value> : parent<int, Value> {
void bar() const {
this->foo();
std::clog << "child: int, " << Value << std::endl;
}
};
template<int Value>
struct child<char, Value> : parent<char, Value> {
void bar() const {
this->foo();
std::clog << "child: char, " << Value << std::endl;
}
};
int main() {
child<int, 1>().bar();
child<char, 2>().bar();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKCnRlbXBsYXRlPHR5cGVuYW1lLCBpbnQgVmFsdWU+CnN0cnVjdCBwYXJlbnQgewoKICAgdm9pZCBmb28oKSBjb25zdCB7CiAgICAgIHN0ZDo6Y2xvZyA8PCAicGFyZW50OiAiIDw8IFZhbHVlIDw8IHN0ZDo6ZW5kbDsKICAgfQp9OwoKdGVtcGxhdGU8dHlwZW5hbWUsIGludD4Kc3RydWN0IGNoaWxkOwoKdGVtcGxhdGU8aW50IFZhbHVlPgpzdHJ1Y3QgY2hpbGQ8aW50LCBWYWx1ZT4gOiBwYXJlbnQ8aW50LCBWYWx1ZT4gewoKICAgdm9pZCBiYXIoKSBjb25zdCB7CiAgICAgIHRoaXMtPmZvbygpOwogICAgICBzdGQ6OmNsb2cgPDwgImNoaWxkOiBpbnQsICIgPDwgVmFsdWUgPDwgc3RkOjplbmRsOwogICB9Cn07Cgp0ZW1wbGF0ZTxpbnQgVmFsdWU+CnN0cnVjdCBjaGlsZDxjaGFyLCBWYWx1ZT4gOiBwYXJlbnQ8Y2hhciwgVmFsdWU+IHsKCiAgIHZvaWQgYmFyKCkgY29uc3QgewogICAgICB0aGlzLT5mb28oKTsKICAgICAgc3RkOjpjbG9nIDw8ICJjaGlsZDogY2hhciwgIiA8PCBWYWx1ZSA8PCBzdGQ6OmVuZGw7CiAgIH0KfTsKCgppbnQgbWFpbigpIHsKICAgY2hpbGQ8aW50LCAxPigpLmJhcigpOwogICBjaGlsZDxjaGFyLCAyPigpLmJhcigpOwp9Cg==