#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
}
