Inferencia de tipo de argumento de visualización de plantilla c ++

Argumentos de visualización de plantilla

En algunos casos, el compilador no puede inferir los tipos de parámetros reales de la plantilla. En algunos otros casos, queremos que el usuario controle la creación de instancias de la plantilla. Estas dos situaciones ocurren con mayor frecuencia cuando el tipo de función es diferente de cualquier tipo en la lista de parámetros.

Especificar los argumentos de la plantilla mostrados

En algunos casos, el compilador no puede inferir el tipo de argumento de plantilla. En otros casos, queremos permitir que los usuarios controlen la creación de instancias de plantillas. Estas dos situaciones ocurren con mayor frecuencia cuando el tipo de retorno de la función y cualquier tipo de lista de parámetros son diferentes.

Especificar los argumentos de la plantilla mostrados

Como ejemplo que permite al usuario especificar el tipo de uso, definiremos una plantilla de función denominada suma que acepta dos tipos diferentes de parámetros. Permitimos a los usuarios especificar el tipo de resultado. De esta forma, el usuario puede seleccionar la precisión adecuada.

template <typename T1,typename T2,typename T3>
T1 sum(T2,T3);

En este ejemplo, no hay un tipo de argumento de función para determinar el tipo de T1. La persona que llama debe proporcionar un argumento de plantilla de visualización para T1 cada vez que se llama a sum.

La forma en que proporcionamos argumentos de plantilla de visualización es diferente de la forma en que definimos instancias de plantilla de clase. Los argumentos de la plantilla de visualización se dan entre paréntesis angulares, después del nombre de la función y antes de la lista de parámetros.

auto val3 = sum<long,long>(i,lng);

Esta llamada muestra el tipo de T1 especificado. El compilador juzga los tipos de T2 y T3 a partir de los tipos de i y long.

El argumento de la plantilla de visualización coincide con los parámetros de la plantilla correspondientes en el orden de izquierda a derecha; la primera plantilla realmente participa en la primera coincidencia de parámetros de la plantilla, la segunda realmente participa en la segunda coincidencia de parámetros, etc. Solo se pueden omitir los parámetros reales de la plantilla de visualización de los parámetros finales, y solo si se pueden inferir de los parámetros de la función. Si nuestra función de suma está escrita de la siguiente forma:

template <typename T1,typename T2,typename T3>  T1 sum(T2 a,T3 b)
{
    return a+b;
}
int main()
{
    auto data = sum<long,long>(1,2);
    auto data2 = sum<long>(1,2);
    return 0;
}

Ambos métodos de escritura son posibles, el compilador puede inferir el resultado devuelto por sí mismo

    string D1("a");
    string D2("n");
    auto data2 = sum<string>(D1,D2);

Estos ejemplos nos dicen que cuando proporcionamos algunos parámetros de plantilla reales, el compilador tiene cierta capacidad para inferir.

Supongo que te gusta

Origin blog.csdn.net/qq_32783703/article/details/105088705
Recomendado
Clasificación