Selección de una función miembro con diferentes condiciones enable_if
En C, enable_if es una herramienta que se utiliza para habilitar o deshabilitar condicionalmente cierto código en función de si un argumento de plantilla cumple con criterios específicos. Esto puede resultar útil cuando desea personalizar el comportamiento de una clase o función según sus parámetros de plantilla.
En el ejemplo dado, el objetivo es crear una función miembro MyFunction que se comporte de manera diferente según si la plantilla El parámetro T es un número entero o no. La implementación prevista es utilizar dos sobrecargas de MyFunction, una para T = int y otra para T != int.
Un método para lograr esto es a través de enable_if, como se muestra en el siguiente código:
template
struct Point {
void MyFunction(
typename std::enable_if<:is_same int>::value, T >::type* = 0) {
std::cout ::value, float >::type* = 0) {
std::cout Sin embargo, este código generará errores de compilación debido al uso incorrecto de enable_if. En C, la sustitución de argumentos de plantilla tiene lugar durante la resolución de sobrecarga. En este caso, no se produce ninguna sustitución porque el tipo de T se conoce en el momento de la creación de instancias de la función miembro.
Para solucionar este problema, se puede introducir un parámetro de plantilla ficticio y establecerlo de forma predeterminada en T, lo que permite SFINAE (El error de sustitución no es un error) para que funcione correctamente:
template
struct Point {
template
typename std::enable_if<:is_same int>::value>::type MyFunction() {
std::cout
typename std::enable_if<:is_same float>::value>::type MyFunction() {
std::cout Este enfoque garantiza que se seleccione la versión correcta de MyFunction según el valor de T.
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