[C con Clase] Templates: No comprendo sintaxis

Steven Davidson srd4121 en njit.edu
Jue Mar 12 16:00:26 CET 2009


Hola Vicente,

vicente lozano wrote:
> Hola,
> 
> Leyendo un poco de codigo me he encontrado con un template que no 
> consigo entender, a ver si podeis echarme una mano:

[CORTE]

> 
> Entiendo que se define una clase MessageMappingOscPacketListener que
> deriva de OscPacketListener y que usa una clase generica T.
> 
> Define como publico un tipo: function_type que es una operacion de la
> clase T que devuelve void y acepta como parametros 2 referencias 
> constantes, (osc::ReceivedMessage y IpEndpointName). (No se como
> poner esto en UML)
> 

Bueno, técnicamente, 'function_type' es un puntero a una función miembro 
de la clase T. Esto actúa como un "tipo de función"; de ahí el nombre 
'function_type'.

> Define como protegido una funcion UML -> 
> #RegisterMessageFunction(char*, function_type) : void
> y otra: UML ->/ #//ProcessMessage( osc::ReceivedMessage& , 
> IpEndpointName& ): void
> 
> Define como privado un struct cstr_compare cuyo unico miembro es una
> funcion que sobrecarga el operador () para aceptar dos punteros a
> char constantes y devolver un bool: (Porque hace esto? como se usaria
> ese struct?)
> 

Esto lo hace porque será usado en la clase-plantilla 'map' como la 
función de comparación para poder ordenar elementos internamente. La 
clase-plantilla espera obtener una estructura o clase que contenga el 
operador (). Por ejemplo, hará algo así,

const char *psz1, *psz2;
function_type func;
cstr_compare comparar;

// ¿ psz1 > psz2 ?
if( !comparar( psz1, psz2 ) )
{
   ...
}

> Y luego define otro tipo que ya no tengo ni idea de que hace.
> 

Supongo que te refieres al mapa. La clase-plantilla 'map' pertenece a 
las bibliotecas de ANSI C++. Esta plantilla sirve para crear una lista 
de parejas. Cada pareja asocia un valor único con otro. Automáticamente, 
las parejas son ordenadas según el criterio dado, que en este caso es 
'cstr_compare'.

Luego, se declara el objeto 'functions_' de la clase generada a partir 
de 'map'. Básicamente, hemos creado una lista de punteros a funciones 
miembros de la clase T, en la que cada puntero a función es asociado a 
un nombre - como una cadena de caracteres. Por ejemplo, podemos tener lo 
siguiente:

"hola" <=> clase::mostrar_hola()
"abrir" <=> clase::conectar()
"cerrar" <=> clase::salir()
"nuevo" <=> clase::crearNuevo()

Usamos esta clase-plantilla 'MessageMappingOscPacketListener' para 
registrar y asociar una cadena con una función miembro y luego 
invocarla. Según la representación del mensaje recibido como una cadena 
de caracteres, buscaremos la función miembro asociada a ella y la 
invocaremos.


Espero haber aclarado las dudas.

Steven





Más información sobre la lista de distribución Cconclase