#include <iostream>
template <typename T>
class SomeClass
{
};
template <typename T>
void foo(T)
{
std::cout << "foo() Generic - Undesired function\n";
}
template <typename T>
void foo(const SomeClass<T>*)
{
std::cout << "foo() SomeClass<T> - Desired function\n";
}
int main()
{
SomeClass<char>* sc = new SomeClass<char>();
foo(sc);
return 0;
}
CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyBTb21lQ2xhc3MKewp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnZvaWQgZm9vKFQpCnsKICAgc3RkOjpjb3V0IDw8ICJmb28oKSBHZW5lcmljIC0gVW5kZXNpcmVkIGZ1bmN0aW9uXG4iOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kdm9pZCBmb28oY29uc3QgU29tZUNsYXNzPFQ+KikKewogICBzdGQ6OmNvdXQgPDwgImZvbygpIFNvbWVDbGFzczxUPiAtIERlc2lyZWQgZnVuY3Rpb25cbiI7Cn0KCmludCBtYWluKCkKewogICBTb21lQ2xhc3M8Y2hhcj4qIHNjID0gbmV3IFNvbWVDbGFzczxjaGFyPigpOwogICBmb28oc2MpOwogICByZXR1cm4gMDsKfQoK