#include <iostream>
struct foo1 { };
struct foo2 { typedef int bar; };
template<typename T>
void dispatch_impl(...)
{
std::cout << "default target\n";
}
template<typename T>
void dispatch_impl(typename T::bar*)
{
std::cout << "specialized target\n";
}
template<typename T>
void dispatch()
{
dispatch_impl<T>(0);
}
int main()
{
dispatch<foo1>();
dispatch<foo2>();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IGZvbzEgeyB9OwpzdHJ1Y3QgZm9vMiB7IHR5cGVkZWYgaW50IGJhcjsgfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnZvaWQgZGlzcGF0Y2hfaW1wbCguLi4pCnsKICAgIHN0ZDo6Y291dCA8PCAiZGVmYXVsdCB0YXJnZXRcbiI7Cn0KCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnZvaWQgZGlzcGF0Y2hfaW1wbCh0eXBlbmFtZSBUOjpiYXIqKQp7CiAgICBzdGQ6OmNvdXQgPDwgInNwZWNpYWxpemVkIHRhcmdldFxuIjsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kdm9pZCBkaXNwYXRjaCgpCnsKICAgIGRpc3BhdGNoX2ltcGw8VD4oMCk7Cn0KCmludCBtYWluKCkKewogICAgZGlzcGF0Y2g8Zm9vMT4oKTsKICAgIGRpc3BhdGNoPGZvbzI+KCk7Cn0=