Inferencia de tipos en C++ (auto y decltype)

La inferencia de tipo se refiere a la deducción automática del tipo de datos de una expresión en un lenguaje de programación. Antes de C++ 11, cada tipo de datos debía declararse explícitamente en tiempo de compilación, lo que limitaba los valores de una expresión en tiempo de ejecución, pero después de la nueva versión de C++, se incluyen muchas palabras clave que permiten al programador dejar la deducción del tipo al propio compilador. . 
Con las capacidades de inferencia de tipos, podemos pasar menos tiempo escribiendo cosas que el compilador ya sabe. Como todos los tipos se deducen solo en la fase de compilación, el tiempo de compilación aumenta ligeramente pero no afecta el tiempo de ejecución del programa.

1) palabra clave auto: La palabra clave auto especifica que el tipo de variable que se declara se deducirá automáticamente de su inicializador. En el caso de las funciones, si su tipo de devolución es automático, se evaluará mediante la expresión de tipo de devolución en tiempo de ejecución. Un buen uso de auto es evitar largas inicializaciones al crear iteradores para contenedores.   

Nota: La variable declarada con la palabra clave auto debe inicializarse solo en el momento de su declaración o, de lo contrario, habrá un error en tiempo de compilación. 

CPP

// C++ program to demonstrate working of auto
// and type inference
 
#include <bits/stdc++.h>
using namespace std;
 
int main()
{
    // auto a; this line will give error
    // because 'a' is not initialized at
    // the time of declaration
    // a=33;
 
    // see here x ,y,ptr are
    // initialised at the time of
    // declaration hence there is
    // no error in them
    auto x = 4;
    auto y = 3.37;
    auto ptr = &x;
    cout << typeid(x).name() << endl
         << typeid(y).name() << endl
         << typeid(ptr).name() << endl;
 
    return 0;
}
Producción

i
d
Pi

Nota: Hemos usado typeid para obtener el tipo de las variables. 

Typeid es un operador que se utiliza cuando se necesita conocer el tipo dinámico de un objeto. 

typeid(x).name() devuelve el tipo de datos de x, por ejemplo, devuelve ‘i’ para enteros, ‘d’ para dobles, ‘Pi’ para el puntero a entero, etc. Pero el nombre real devuelto es principalmente compilador dependiente. 

Un buen uso de auto es evitar largas inicializaciones al crear iteradores para contenedores.

C++

// C++ program to demonstrate that we can use auto to
// save time when creating iterators
 
#include <bits/stdc++.h>
using namespace std;
 
int main()
{
    // Create a set of strings
    set<string> st;
    st.insert({ "geeks", "for", "geeks", "org" });
 
    // 'it' evaluates to iterator to set of string
    // type automatically
    for (auto it = st.begin(); it != st.end(); it++)
        cout << *it << " ";
 
    return 0;
}
Producción

for geeks org 

Nota: auto se convierte en tipo int incluso si se le asigna una referencia entera. Para convertirlo en tipo de referencia, usamos auto &. 

  • Función que devuelve un tipo ‘referencia a int’: int& fun() {};
  • m por defecto será int type en lugar de int& type : auto m = fun();
  • n será de tipo int& debido al uso de extra & con la palabra clave auto: auto& n = fun();

2) Keyword decltype: Inspecciona el tipo declarado de una entidad o el tipo de una expresión. ‘auto’ le permite declarar una variable con un tipo particular, mientras que decltype le permite extraer el tipo de la variable, por lo que decltype es una especie de operador que evalúa el tipo de expresión pasada. 
La explicación de las palabras clave anteriores y sus usos se da a continuación: 

CPP

// C++ program to demonstrate use of decltype
#include <bits/stdc++.h>
using namespace std;
 
int fun1() { return 10; }
char fun2() { return 'g'; }
 
int main()
{
    // Data type of x is same as return type of fun1()
    // and type of y is same as return type of fun2()
    decltype(fun1()) x;
    decltype(fun2()) y;
 
    cout << typeid(x).name() << endl;
    cout << typeid(y).name() << endl;
 
    return 0;
}
Producción

i
c

A continuación se muestra un ejemplo más para demostrar el uso de decltype ,

CPP

// C++ program to demonstrate use of decltype
#include <bits/stdc++.h>
using namespace std;
 
// Driver Code
int main()
{
    int x = 5;
 
    // j will be of type int : data type of x
    decltype(x) j = x + 5;
 
    cout << typeid(j).name();
 
    return 0;
}
Producción

i

Un programa que demuestra el uso de auto y decltype 

A continuación se muestra una función de plantilla de C++ min_type() que devuelve el mínimo de dos números. Los dos números pueden ser de cualquier tipo integral. El tipo de devolución se determina utilizando el tipo de mínimo de dos.

CPP

// C++ program to demonstrate use of decltype in functions
#include <bits/stdc++.h>
using namespace std;
 
// A generic function which finds minimum of two values
// return type is type of variable which is minimum
template <class A, class B>
auto findMin(A a, B b) -> decltype(a < b ? a : b)
{
    return (a < b) ? a : b;
}
 
// driver function to test various inference
int main()
{
    // This call returns 3.44 of double type
    cout << findMin(4, 3.44) << endl;
 
    // This call returns 3 of double type
    cout << findMin(5.4, 3) << endl;
 
    return 0;
}
Producción

3.44
3

decltipo vs typeid

  • Decltype brinda la información de tipo en tiempo de compilación, mientras que typeid brinda en tiempo de ejecución.
  • Por lo tanto, si tenemos una referencia de clase base (o puntero) que se refiere a (o apunta a) un objeto de clase derivada, decltype daría el tipo como referencia de clase base (o puntero, pero typeid daría la referencia de tipo derivado (o puntero) .

Este artículo es una contribución de Utkarsh Trivedi . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente. 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *