#include <iostream>
#include <vector>
#include <string>
template <typename T>
class A
{
public:
template <typename U>
void foo() const { foo_impl(Overload<U>()); }
private:
template <typename U>
struct Overload { };
template <typename U>
void foo_impl(Overload<U>) const { print("general implementation"); }
void foo_impl(Overload<double>) const { print("specialization for double"); }
template <typename U>
void foo_impl(Overload<std::vector<U>>) const { print("specialization for vectors of all types"); }
void print(const std::string& text) const
{
std::cout << this << ": " << text <<std::endl;
}
};
int main() {
A<int> a;
a.foo<int>();
a.foo<double>();
a.foo<std::vector<bool>>();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CmNsYXNzIEEKewpwdWJsaWM6CgogIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgogIHZvaWQgZm9vKCkgY29uc3QgeyBmb29faW1wbChPdmVybG9hZDxVPigpKTsgfQoKcHJpdmF0ZToKCiAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CiAgc3RydWN0IE92ZXJsb2FkIHsgfTsKCiAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CiAgdm9pZCBmb29faW1wbChPdmVybG9hZDxVPikgY29uc3QgeyBwcmludCgiZ2VuZXJhbCBpbXBsZW1lbnRhdGlvbiIpOyB9CgogIHZvaWQgZm9vX2ltcGwoT3ZlcmxvYWQ8ZG91YmxlPikgY29uc3QgeyBwcmludCgic3BlY2lhbGl6YXRpb24gZm9yIGRvdWJsZSIpOyB9CgogIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgogIHZvaWQgZm9vX2ltcGwoT3ZlcmxvYWQ8c3RkOjp2ZWN0b3I8VT4+KSBjb25zdCB7IHByaW50KCJzcGVjaWFsaXphdGlvbiBmb3IgdmVjdG9ycyBvZiBhbGwgdHlwZXMiKTsgfQoKICB2b2lkIHByaW50KGNvbnN0IHN0ZDo6c3RyaW5nJiB0ZXh0KSBjb25zdAogIHsKICAJc3RkOjpjb3V0IDw8IHRoaXMgPDwgIjogIiA8PCB0ZXh0IDw8c3RkOjplbmRsOwogIH0KfTsKCmludCBtYWluKCkgewoKICBBPGludD4gYTsKCiAgYS5mb288aW50PigpOwogIGEuZm9vPGRvdWJsZT4oKTsKICBhLmZvbzxzdGQ6OnZlY3Rvcjxib29sPj4oKTsKfQ==