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