elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  templates : T y T*
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: templates : T y T*  (Leído 2,060 veces)
digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
templates : T y T*
« en: 5 Octubre 2021, 05:24 am »

Buenas señores..

Tengo una duda a medias... creo entender como va esto de las plantillas pero quisiera estar seguro.

Del siguiente codigo:
Código
  1. template <typename T>
  2. void my_function ( T _param);


Entiendo que para este caso, T es un tipo generico que acepta cualquier clase de argumento (puntero, referencia o valor)
Como quien dice, no tiene formato, puede ser constante, estatico, etc...

Código
  1. int x = 19;
  2. my_function ( x );  //en la plantilla, T se transformaria en int    ....     int _param = 19;
  3.  
  4. int * px = &x;
  5. my_function ( px );  //en la plantilla, T se transformaria en int *    ....      int * _param = &x;

Como T es virgen (por decirlo de alguna forma), no esta pre-formateada, simplemente es una T sola, puede aceptar cualquier tipo de clase y con cualquier tipo de atributo... es asi?



Pero en este siguiente caso:
Código
  1. template <typename T>
  2. void my_function ( T* _param);


Aqui T es puntero, entiendo que solo acepta una direccion de memoria u otro puntero, pero no un elemento por valor, ya que T* ha sido pre-formateado para funcionar solo como puntero.

Código
  1. int x = 19;
  2. my_function ( x );  //esto produce un error porque x es un tipo, no un puntero....
  3.  
  4. int * px = &x;
  5. my_function ( px );   //esto estaria bien, ya que seria una asignacion de puntero....


Segun entiendo, en el fondo la asignacion a un tipo plantilla es como si se comportara como override de funcion:


T = Acepta cualquier cosa por valor
T& = Acepta cualquier cosa solo que como referencia
T* = Preformateada para aceptar solo punteros o direcciones de memoria o referencias a punteros
const T = Preformateada para aceptar cualquier cosa por valor pero se transforma obligatoriamente en constante
const T& = Preformateada para aceptar cualquier cosa por referencia pero se transforma en constante
const T* = Preformateada para aceptar solo punteros o direcciones de memoria y lo transforma a constante.


En el siguiente ejemplo:
Código
  1. template <typename T>
  2. void my_function ( const T* _param);
  3.  
  4. const float * pfloat = new float(12.5f);
  5. my_function ( pfloat );   //esto se asignara bien.
  6.  
  7. float * pfloat2 = new  float (6.9f);
  8. my_function ( pfloat2 );   //esto tendria el mismo efecto que pfloat ya que en la plantilla siempre quedara como const.
  9.  
  10.  


Es mas o menos como lo creo?

Saludos


En línea

Dungeons & dragons;
dragons.Attack();
Loretz

Desconectado Desconectado

Mensajes: 117


Ver Perfil
Re: templates : T y T*
« Respuesta #1 en: 5 Octubre 2021, 08:04 am »

Hola, creo que te facilitará la idea si consideras que en

Código
  1. template <typename T>
  2. void my_function ( T _param);

T es el tipo del parámetro _param, o lo que es lo mismo: "el tipo de _param es T"; como cuando se tiene int i = 5; decimos que el tipo de i es int, o que i es de tipo int. (Fíjate que le he dado la vuelta a la forma en que lo dices).

Cuando se tiene int* p; se dice que p es de tipo int* (Como el C++ está más centrado en tipos que el C, es por eso que se prefiere escribir int* p en lugar de int *p).

En el ejemplo de acá abajo, la función genérica f tiene un parámetro t de tipo T*. Creo que al decirlo de esta manera se percibe más claramente la idea.

Código
  1. #include <iostream>
  2. #include <typeinfo>
  3.  
  4. template<typename T>
  5. void f(T* t) {
  6.    std::cout << "type: " << typeid(t).name() << '\n';
  7. }
  8.  
  9. int main()
  10. {
  11.    int* p = new int(6);
  12.  
  13.    f<int>(p);  // en esta funcion el tipo de t es "int*".
  14.    f(p);       // es lo mismo ("Template argument deduction")
  15.  
  16.    f<int*>(&p); // en esta segunda funcion el tipo de t es "int**"
  17.    f(&p);       // es lo mismo ("Template argument deduction")
  18.  
  19.    std::string str = "hola";
  20.    f(&str);
  21. }





En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Templates flash mx
Diseño Gráfico
limalimon1 0 1,717 Último mensaje 5 Febrero 2005, 16:38 pm
por limalimon1
TEMPLATES
Diseño Gráfico
Villamil 5 2,450 Último mensaje 12 Abril 2005, 21:12 pm
por Sub_Cero
algun tutorial de templates
Diseño Gráfico
ROnsOcO 2 1,743 Último mensaje 8 Julio 2005, 21:06 pm
por PhenfiX
Templates de manga y anime
Diseño Gráfico
NeRoFiLo 0 1,732 Último mensaje 31 Agosto 2005, 11:08 am
por NeRoFiLo
Templates gratis Joomla.
Desarrollo Web
mk46 1 1,510 Último mensaje 8 Septiembre 2015, 15:23 pm
por #!drvy
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines