Pregunta

Me encontré con una situación extraña hoy en día en el que necesitaba una función para no convertir implícitamente valores.

Después de algunos mirando en Google me encontré con este http://www.devx.com/cplus/10MinuteSolution/37078 / 1954

Sin embargo, pensé que era un poco estúpido utilizar una sobrecarga de la función de cualquier otro tipo que quiero bloquear así que en vez que hice esto.


void function(int& ints_only_please){}

int main() { char a=0; int b=0; function(a); function(b); }

Me mostró el código a un amigo y él sugirió añadí const int antes de lo que la variable no es editable, sin embargo, cuando me empezó a recopilar bien, pero no debe, mirada abajo para ver lo que quiero decir


void function(const int& ints_only_please){}

int main() { char a=0; int b=0; function(a); //Compiler should stop here but it doesn't with const int function(b); }

¿Alguien sabe qué es esto?

¿Fue útil?

Solución

El uso de plantillas para obtener el efecto deseado:

template <class T>
void foo(const T& t);

template <>
void foo<int>(const int& t)
{

}

int main(){
  foo(9); // will compile
  foo(9.0); // will not compile
  return 0;
}

Tenga en cuenta que sólo escribimos una versión especial de la plantilla para int de manera que una llamada que tiene cualquier otro tipo como un parámetro de plantilla dará lugar a un error de compilación.

Otros consejos

Es legal para vincular una referencia temporal a un const, pero no una referencia no const.

A char se puede convertir implícitamente a un int y el temporal que es el resultado de esta conversión puede ser unido a un parámetro de la función const int& se extiende la vida útil del temporal hasta que las salidas de función.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top