2010-12-02 29 views
7

duplicados posibles:
Function overloading by return type?
Puzzle: Overload a C++ function according to the return value¿Por qué no se pueden sobrecargar las funciones por tipo de devolución?

Porque tengo una biblioteca que expone un montón de funciones en la forma de:

bool GetVal(); 
double GetVal(); 
int GetVal(); 
long GetVal(); 
//So on. 

y ahora tengo para envolver estos Prefiero no volver a escribir el mismo conjunto de funciones de nuevo. Me gustaría hacer algo como

template<class T> 
T GetVal(){} 

Pero parece que no puedo hacer que funcione. ¿Algunas ideas?

+0

Además del enlace de arriba, también hay http://stackoverflow.com/questions/226144/puzzle-overload-ac-function-according-to-the-return-value y algunos otros –

+2

que dices que tienes una biblioteca que ya se sobrecarga por tipo de devolución? Eso suena improbable – jalf

+0

@jalf: Mi conjetura es que las funciones están en diferentes espacios de nombres. –

Respuesta

16

No puede sobrecargar en los tipos de devolución ya que no es obligatorio usar el valor de retorno de las funciones en una expresión de llamada a función.

Por ejemplo, yo sólo puedo decir

GetVal(); 

¿Qué hace el compilador ahora?

+5

El compilador podría simplemente emitir un mensaje de "Tipo de devolución ambiguo" y rehusarse a compilar. Esto no es justificación suficiente por sí solo. –

+0

@Mark Ransom: empecemos por diferir aquí. Consulte $ 7.4.1 de "The C++ Programming Lanugage 3rd Edition" por Stroustrup – Chubsdad

+0

Alternativamente: supongamos que definimos 'float GetVal()' y 'double GetVal()', y escribimos 'int x = GetVal();'. ¿Ahora que? O bien un 'float' o un' double' se puede convertir implícitamente a 'int'. –

0

Usted puede intentar

  1. template <typename T> T GetVal(T) {...} lugar (utilizando una variable ficticia para realizar la resolución)
  2. conversiones Uso de tipo

o simplemente utilizar el simplista GetValBool etc.

+0

No hay diferencia entre' plantilla T GetVal() 'y' plantilla T GetVal() ', y la pregunta dice que la primera no funciona. Por supuesto, sería bueno saber por qué nakiya cree eso, pero sin preguntar que 1. no es demasiado útil. – ephemient

+5

@ephemient: Mira de nuevo, ha aprobado un parámetro ficticio para realizar trabajo de sobrecarga. –

0

Sólo hay una función en C++ que puede estar sobrecargada por el tipo de retorno, la función especial del operador de conversión implícita, llamada operator T() (con T variando).

2

El tipo de retorno de las funciones no es parte del nombre destruido que genera el compilador para identificar de forma única cada función. El
n de argumentos
tipo de argumentos &
secuencia de argumentos
son los parámetros que se utilizan para generar el nombre revuelto único para cada función. Es sobre la base de estos nombres destrozados únicos que el compilador puede entender qué función llamar incluso si los nombres son iguales (sobrecarga) .Hence .....

+0

Incluso si se usó el tipo de devolución para el cambio de nombre, no sería posible determinar la función exacta a llamar si se descarta el valor de retorno de la llamada a la función. – Chubsdad

+9

Para ser precisos: el hecho de que el cambio de nombre no tenga en cuenta el tipo de devolución es un resultado, no una causa. Si el estándar hubiera dicho que era posible, el cambio de nombres debería haber incluido el tipo de devolución. – MSalters

+0

@ Chubsdad, MSalters: ¡De acuerdo, punto bien hecho! –

0

No, no puede sobrecargar según el tipo de devolución .

a partir de documentos estándar, Sec 13.1.2,

-. Las declaraciones de funciones que difieren únicamente en el tipo de retorno no se puede sobrecargar.

Y en cuanto a su biblioteca, cada función puede pertenecer a un espacio de nombres diferente o de lo contrario tampoco es posible.

Cuestiones relacionadas