Sovraccarico per tipo di reso

Ho letto alcune domande qui su SO su questo argomento che mi sembra ancora confuso. Ho appena iniziato a imparare il C ++ e non ho ancora studiato i modelli o il sovraccarico dell’operatore e così via.

Ora c’è un modo semplice per sovraccaricare

class My { public: int get(int); char get(int); } 

senza modelli o comportamento strano? o dovrei solo

 class My { public: int get_int(int); char get_char(int); } 

?

No, non c’è. Non è ansible sovraccaricare i metodi in base al tipo restituito.

La risoluzione del sovraccarico tiene conto della firma della funzione . Una firma di funzione è composta da:

  • nome della funzione
  • CV-qualificazioni
  • tipi di parametri

Ed ecco la citazione:

Firma 1.3.11

le informazioni su una funzione che partecipa alla risoluzione di sovraccarico (13.3): la sua lista tipo-parametro (8.3.5) e, se la funzione è un membro della class, i qualificatori cv (se ce ne sono) sulla funzione stessa e la class in cui viene dichiarata la funzione membro. […]

Opzioni:

1) cambia il nome del metodo:

 class My { public: int getInt(int); char getChar(int); }; 

2) parametro out:

 class My { public: void get(int, int&); void get(int, char&); } 

3) modelli … eccessivo in questo caso.

È ansible, ma non sono sicuro che sia una tecnica che consiglierei ai principianti. Come in altri casi, quando si desidera che la scelta delle funzioni dipenda da come viene utilizzato il valore di ritorno, si utilizza un proxy; per prima cosa definisci funzioni come getChar e getInt , quindi un generico get() che restituisce un Proxy come questo:

 class Proxy { My const* myOwner; public: Proxy( My const* owner ) : myOwner( owner ) {} operator int() const { return myOwner->getInt(); } operator char() const { return myOwner->getChar(); } }; 

Estendilo a tutti i tipi di cui hai bisogno.

No, non puoi sovraccaricare per tipo di ritorno; solo per tipi di parametri e qualificatori const / volatili.

Un’alternativa sarebbe “tornare” usando un argomento di riferimento:

 void get(int, int&); void get(int, char&); 

anche se probabilmente utilizzerei un modello o funzioni con nomi diversi come il tuo secondo esempio.

Puoi pensare in questo modo:

Hai:

  int get(int); char get(int); 

E, non è obbligatorio raccogliere il valore di ritorno della funzione durante il richiamo.

Ora, invochi

  get(10); -> there is an ambiguity here which function to invoke. 

Quindi, nessun significato se il sovraccarico è consentito in base al tipo di ritorno.

Non c’è modo di sovraccaricare il tipo restituito in C ++. Senza usare i template, usare get_int e get_char sarà il meglio che puoi fare.

Non è ansible sovraccaricare i metodi in base ai tipi restituiti. La soluzione migliore è creare due funzioni con una syntax leggermente diversa, ad esempio nel secondo frammento di codice.

non è ansible sovraccaricare una funzione in base al tipo di ritorno della funzione. è ansible eseguire l’overlead in base al tipo e al numero di argomenti utilizzati da questa funzione.

Mentre la maggior parte degli altri commenti su questo problema sono tecnicamente corretti, è ansible sovraccaricare efficacemente il valore restituito se lo si combina con il parametro di input overload. Per esempio:

 class My { public: int get(int); char get(unsigned int); }; 

DEMO:

 #include  class My { public: int get( int x) { return 'I'; }; char get(unsinged int x) { return 'C'; }; }; int main() { int i; My test; printf( "%c\n", test.get( i) ); printf( "%c\n", test.get((unsigned int) i) ); } 

Il risultato di questo è:

 IC