#include <iostream>
template < typename T > struct ff ;
template <typename T> void f( T t ) { ff<T>::f(t) ; }
template < typename T > struct ff
{ static void f(T) { std::cout << "general\n" ; } } ;
template < typename T > struct ff<T*>
{ static void f(T*) { std::cout << "partial for pointers\n" ; } } ;
template <> struct ff<int>
{ static void f(int) { std::cout << "complete for int\n" ; } } ;
int main()
{
f('a') ; // general
int a = 8 ;
f(a) ; // complete for int
f(&a) ; // partial for pointers
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPCB0eXBlbmFtZSBUID4gc3RydWN0IGZmIDsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIGYoIFQgdCApIHsgZmY8VD46OmYodCkgOyB9Cgp0ZW1wbGF0ZSA8IHR5cGVuYW1lIFQgPiBzdHJ1Y3QgZmYKeyBzdGF0aWMgdm9pZCBmKFQpIHsgc3RkOjpjb3V0IDw8ICJnZW5lcmFsXG4iIDsgfSB9IDsKCnRlbXBsYXRlIDwgdHlwZW5hbWUgVCA+IHN0cnVjdCBmZjxUKj4KeyBzdGF0aWMgdm9pZCBmKFQqKSB7IHN0ZDo6Y291dCA8PCAicGFydGlhbCBmb3IgcG9pbnRlcnNcbiIgOyB9IH0gOwoKdGVtcGxhdGUgPD4gc3RydWN0IGZmPGludD4KeyBzdGF0aWMgdm9pZCBmKGludCkgeyBzdGQ6OmNvdXQgPDwgImNvbXBsZXRlIGZvciBpbnRcbiIgOyB9IH0gOwoKaW50IG1haW4oKQp7CiAgICBmKCdhJykgOyAvLyBnZW5lcmFsCiAgICBpbnQgYSA9IDggOwogICAgZihhKSA7IC8vIGNvbXBsZXRlIGZvciBpbnQKICAgIGYoJmEpIDsgLy8gcGFydGlhbCBmb3IgcG9pbnRlcnMKfQo=