#include <iostream>
#include <vector>
template<typename T, class Derived>
class FooBase {
public:
void foo(const std::vector<T> vec) {
static_cast<Derived&>(*this).fooImpl(vec);
}
};
template<typename T>
class Foo : FooBase<T, Foo<T>> {
public:
void fooImpl(const std::vector<T> vec) {
std::cout << "Normal foo";
}
};
template
class Foo<uint16_t>;
template
class Foo<uint32_t>;
template
class Foo<uint64_t>;
template <>
class Foo<int16_t>: public FooBase<uint16_t, Foo<int16_t>>, public Foo<uint16_t> {
public:
using FooBase<uint16_t, Foo<int16_t>>::foo;
void fooImpl(const std::vector<uint16_t> vec) {
std::cout << "Special foo";
Foo<uint16_t>::fooImpl(vec);
}
};
int main() {
Foo<int16_t>().foo(std::vector<uint16_t>());
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdGVtcGxhdGU8dHlwZW5hbWUgVCwgY2xhc3MgRGVyaXZlZD4KY2xhc3MgRm9vQmFzZSB7CnB1YmxpYzoKICAgIHZvaWQgZm9vKGNvbnN0IHN0ZDo6dmVjdG9yPFQ+IHZlYykgewogICAgICAgIHN0YXRpY19jYXN0PERlcml2ZWQmPigqdGhpcykuZm9vSW1wbCh2ZWMpOwogICAgfQp9Owp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpjbGFzcyBGb28gOiBGb29CYXNlPFQsIEZvbzxUPj4gewpwdWJsaWM6CiAgICB2b2lkIGZvb0ltcGwoY29uc3Qgc3RkOjp2ZWN0b3I8VD4gdmVjKSB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJOb3JtYWwgZm9vIjsKICAgIH0KfTsKCgp0ZW1wbGF0ZQpjbGFzcyBGb288dWludDE2X3Q+Owp0ZW1wbGF0ZQpjbGFzcyBGb288dWludDMyX3Q+Owp0ZW1wbGF0ZQpjbGFzcyBGb288dWludDY0X3Q+OwoKdGVtcGxhdGUgPD4KY2xhc3MgRm9vPGludDE2X3Q+OiBwdWJsaWMgRm9vQmFzZTx1aW50MTZfdCwgRm9vPGludDE2X3Q+PiwgcHVibGljIEZvbzx1aW50MTZfdD4gewpwdWJsaWM6Cgl1c2luZyBGb29CYXNlPHVpbnQxNl90LCBGb288aW50MTZfdD4+Ojpmb287CiAgICB2b2lkIGZvb0ltcGwoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IHZlYykgewogICAgICAgIHN0ZDo6Y291dCA8PCAiU3BlY2lhbCBmb28iOwogICAgICAgIEZvbzx1aW50MTZfdD46OmZvb0ltcGwodmVjKTsKICAgIH0KfTsKCmludCBtYWluKCkgewoJRm9vPGludDE2X3Q+KCkuZm9vKHN0ZDo6dmVjdG9yPHVpbnQxNl90PigpKTsKCXJldHVybiAwOwp9