"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿El argumento de plantilla de `std::function` influye en su tipo durante la construcción del objeto?

¿El argumento de plantilla de `std::function` influye en su tipo durante la construcción del objeto?

Publicado el 2024-12-13
Navegar:106

Does the Template Argument of `std::function` Influence its Type During Object Construction?

¿Está el argumento de plantilla de std::function incluido en su tipo?

Introducción al problema

Al emplear la plantilla std::function, ambigüedad pueden surgir debido a múltiples sobrecargas posibles. Específicamente, considere el siguiente fragmento de código:

#include 

using namespace std;

int a(const function& f) { return f(); }
int a(const function& f) { return f(0); }
int x() { return 22; }
int y(int) { return 44; }

int main() {
    a(x); // Call is ambiguous.
    a(y); // Call is ambiguous.
}

La ambigüedad surge del hecho de que tanto la función como la función se pueden construir a partir de un puntero de función genérico. Esto introduce múltiples coincidencias potenciales para sobrecargas de una función.

Resolución de ambigüedad

La firma del argumento de plantilla para std::function se considera parte de su tipo durante la declaración y definición. Sin embargo, este no es el caso durante la construcción de objetos.

std::function, como muchos objetos funcionales en C, utiliza una técnica llamada borrado de tipos. Esto le permite aceptar objetos o funciones arbitrarias, siempre que cumplan con la firma esperada cuando se llamen. La desventaja es que los errores relacionados con firmas no coincidentes ocurren en lo profundo de la implementación, en lugar de en el nivel del constructor.

Eludir la ambigüedad

Existen tres opciones principales para evitar esta ambigüedad:

  • Conversión de tipo explícito: convierte manualmente los punteros de función a la firma específica requerida por el usuario deseado. sobrecarga.
  • Ajuste de objeto de función: cree un objeto de función del tipo apropiado y páselo en su lugar.
  • Metaprogramación de plantilla (TMP): Usar TMP para generar una función con la firma deseada, evitando conversiones explícitas.

Conclusión

Mientras que el argumento de plantilla de std::function sí lo hace determinar su tipo durante las declaraciones y definiciones, no juega ningún papel en la construcción de objetos. Esto puede generar ambigüedad cuando los constructores aceptan argumentos arbitrarios. Para resolver esto, los programadores pueden usar conversión de tipos explícita, ajuste de objetos de función o TMP.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3