especialización parcial de plantillas de funciones

En el fragmento de código a continuación,

template<typename T1>
void func(T1& t)
{
    cout << "all" << endl;
}

template<typename T2>
void func(T2 &t)
{
    cout << "float" << endl;
}

// I do not want this
// template<> void func(float &t)

int main()
{
    int i; float f;
    func(i); // should print "all"
    func(f); // should print "float" 
    return 0;
}

Me gustaría que se modifiquen las plantillas que al pasar cualquier tipo que no sea float imprimirá "all" y al pasar float imprimirá "float". No quiero la especialización de plantilla, en cambio tengo una especialización parcial que actuará de acuerdo con el tipo de entrada. ¿Cómo debo hacerlo? Gracias por adelantado

Bueno, el escenario que estoy enfrentando actualmente es como, necesito tener lo siguiente definido,

template<typename T1>
void func(T1 &t)
{
    cout << "t1" << endl;
}

template<typename T2>
void func(T2 &t)
{
    cout << "t2" << endl;
}

Las siguientes llamadas deberían imprimir "t2"

func(int) // print "t2"
func(float) // print "t2"
func(string) // print "t2"

Las siguientes llamadas deben imprimir "t1"

func(char) // print "t1"
func(xyz) // print "t1"
...
func(abc) // print "t1"

algún tipo de agrupación como la anterior donde pocos deberían llamar a la implementación de especialización parcial y otros deberían llamar a la implementación predeterminada.

Respuestas a la pregunta(5)

Su respuesta a la pregunta