2013-04-21 11 views
5

In C# questo è certamente possibile, come questo esempio compilabile può mostrare:Posso avere una funzione/metodo che passa un argomento per riferimento e un sovraccarico che lo passa per valore in C++?

static void Teste(int x) { } 
static void Teste(ref int x) { } 
static void Teste() 
{ 
    int i = 0; 
    Teste(i); 
    Teste(ref i); 
} 


Ma si può fare in C++ (/ CLI) con un costruttore? Vedere l'esempio di seguito:

class Foo 
{ 
    Foo(int bar) 
    { 
     // initializing "Foo" instance... 
    } 
    Foo(int &bar) 
    { 
     // initializing "Foo" instance... 
    } 

    //... 
} 

Anche se questa classe si compila con questi costruttori non riesco a vedere come scegliere quando applico uno sono gli altri, vale a dire, la chiamata è ambigua, in quanto non v'è alcuna parola chiave I conoscere a questo scopo come "ref" in C#. L'ho provato in un costruttore, dove il nome deve essere lo stesso della classe (ovviamente posso aggiungere un parametro inutile, ma voglio sapere se posso non farlo).

BTW, ho cercato su Google e ho ottenuto solo cose come "qual è la differenza tra il passaggio per ref e per valore?" ma niente che copre un sovraccarico come questo. E immagino che come soluzione alternativa io possa usare il puntatore, grazie al "prendere l'indirizzo di" (&); o avere, come detto sopra, un parametro extra inutile. Ma quello che voglio sapere è: posso avere sovraccarichi come questi (per ref/per valore)?

Grazie in anticipo,

+0

Provare a inizializzare i costruttori passando un puntatore a uno e un valore all'altro e vedere ciò che si ottiene – smac89

+0

Questo può essere un duplicato, ma a mia difesa, non effettuo ricerche molto bene; inoltre, il nome dell'altra domanda non è molto accattivante (sebbene il nome di questa sia ancora meno). Inoltre, come sidenote, l'altro mi chiede se ha senso, gli chiedo se è possibile. – JMCF125

risposta

1

si può realizzare qualcosa di simile in C++, fornendo un cast esplicito al tipo desiderato.

struct Foo 
{ 
    Foo(int /*bar*/) {} 
    Foo(int &/*bar*/) {} 
}; 


int main() 
{ 
    int value = 5; 
    Foo foo(static_cast<const int&>(value)); 

    return 0; 
} 

Il cast di const causerà risoluzione di sovraccarico di ignorare costruttore prendendo un riferimento non const e si depositerà il passaggio per valore.

+0

Perché ** const ** 'int &'? Perché non solo 'int &' funziona? – JMCF125

+1

@ JMCF125 Poiché il riferimento non-const può ancora essere passato al costruttore in base al valore. –

+0

Questo è imbarazzante: funzionava, ma ora l'ho testato di nuovo e non lo è! Ora sembra convertirlo da 'const int &' a 'const int' ... – JMCF125

Problemi correlati