2012-09-15 14 views
5

posso effettivamente utilizzare una funzione di sovraccarico come questo:Funzione sovraccaricare con i puntini di sospensione

#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); 
} 

quale standard dice a questo proposito? E in che tipo di situazioni prenderò :: foo (...)?

+1

argomenti variabili. –

risposta

0

quando si dichiara una funzione nel modo seguente:

void foo (...) 

questo significa foo accetta qualsiasi numero di argomenti.

Quindi questa funzione verrà richiamata quando è necessario.

Nel tuo caso ogni volta che non scriverà:

foo(//Some single int). 

Nella vostra specifica principale, questo accadrà:

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(...) avrà argomenti variabili. E verrà chiamato quando il no o il tipo di argomento non corrisponde alla lista di argomenti fornita di altre funzioni con lo stesso nome di funzione.

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:

Anche se i puntini di sospensione funziona bene con l'overloading di funzioni, non è raccomando perseguire funzioni variadic. Almeno non fino a quando non avrai molta più esperienza in C++ per capire le insidie. Suggerirei il suo uso solo con il blocco catch try dove ci sono situazioni in cui l'errore non può essere previsto.

2
void foo(int) 

accetta un argomento di tipo int.

void foo(...) 

accetta qualsiasi numero di argomenti, di qualsiasi tipo. Sarà selezionato quando la chiamata non ha un singolo argomento int. Non molto utile, in generale.

Si noti inoltre che è un comportamento non definito passare oggetti di tipo classe su ....

+0

Tipi di classe non POD, ovvero. (C++ 11 esprime questo requisito in termini di banalità e modifica UB al comportamento definito dall'implementazione supportata in modo condizionale.) –

+0

* un comportamento definito dall'implementazione supportata condizionalmente * mi sembra ancora peggiore.:-) Sembra molto come * Non farlo! *. –

2

In N3337 posso vedere: -

13.3.2 funzioni vitali
Una funzione candidato con meno di parametri m è valida solo se ha un'ellissi nella sua lista di parametri (8.3. 5). Ai fini della risoluzione di sovraccarico , qualsiasi argomento per il quale non esiste un parametro corrispondente è considerato a "corrisponde ai puntini di sospensione" (13.3.3.1.3).

Problemi correlati