2012-09-15 21 views
5

¿Puedo utilizar realmente una sobrecarga de funciones como esto:sobrecarga de funciones con puntos suspensivos

#include <iostream> 

void foo(...) 
{ 
    std::cout << "::foo(...) \n"; 
} 

void foo(int) 
{ 
    std::cout << "::foo(int) \n"; 
} 

int main() 
{ 
    foo(0); 
    foo('A'); 
    foo("str"); 
    foo(0, 1); 
} 

Qué norma dice al respecto? Y en qué tipo de situaciones obtendré :: foo (...)?

+1

argumentos variables. –

Respuesta

0

Cuando se declara una función de la siguiente manera:

void foo (...) 

esto significa foo acepta cualquier número de argumentos.

Por lo que se llamará a esta función cuando esta sea la adecuada.

En su caso siempre que no se va a escribir:

foo(//Some single int). 

En su principal específica, esto sucederá:

foo(0)  //Calls foo(int). 
foo('A) //Calls foo (int). as you can convert a char to an int. 
foo("str") //Calls foo(...) . as you can not convert a string to an int. 
foo(1,2) //Calls foo(...) . as this is the only possible function 
      cause the second foo function only takes one int. 
0

void foo(...) tendrá argumentos variables. Y se llamará cuando el no o el tipo de argumento no coincida con la lista de argumentos proporcionados de otra función con el mismo nombre de función.

foo(0);    //This will call void foo(int) function 
foo('A');   //This will call void foo(int) function 
foo("str");   //This will call void foo(...) function 
foo(0, 1);   //This will call void foo(...) function 

NOTA:

Aunque los puntos suspensivos funciona bien con la sobrecarga de funciones, no es muy recomendable la búsqueda de funciones variadic. Al menos no hasta que tenga una experiencia significativamente mayor en C++ para comprender las trampas. Sugeriría su uso solo con el bloque try catch, donde hay situaciones en las que no se puede predecir el error.

2
void foo(int) 

aceptará un argumento del tipo int.

void foo(...) 

acepta cualquier número de argumentos, de cualquier tipo. Se seleccionará cuando la llamada no tenga un solo argumento int. No es muy útil, en general.

También tenga en cuenta que es un comportamiento indefinido para pasar objetos del tipo de clase a ....

+0

Tipos de clases no POD, es decir. (C++ 11 expresa este requisito en términos de trivialidad y cambia la UB al comportamiento definido de implementación con soporte condicional.) –

+0

* comportamiento definido de implementación con soporte condicional * me suena aún peor.:-) Se parece mucho a * ¡No lo hagas! *. –

2

En N3337 puedo ver: -

13.3.2 funciones viables
Una función candidata que tiene menos de parámetros M es viable sólo si tiene una elipsis en su lista de parámetros (8.3. 5). A los efectos del resolución de sobrecarga, , cualquier argumento para el que no haya un parámetro correspondiente se considera a "coincida con las elipsis" (13.3.3.1.3).

Cuestiones relacionadas