2012-10-24 26 views
8

funzione Diciamo che ho una classe C++ con due funzioni comeoperatore ternario e firma

class MyClass 
{ 
    bool Foo(int val); 
    bool Foo(string val); 
} 

E 'possibile usare l'operatore ternario come questo

MyClassInstance->Foo(booleanValue?24:"a string"); 

e hanno una funzione diversa di MyClass invocato in base al valore di booleanValue?

+2

questo è interessante ... – mauris

+6

Hai provato la compilazione e l'esecuzione per vedere che cosa succede? –

+0

Questo non viene nemmeno compilato. Il compilatore si lamenterà dei diversi tipi dell'operatore ternario. –

risposta

21

Non con l'operatore ternario. Il tipo di un'espressione ternaria è il tipo comune del suo secondo e terzo operando; se non hanno un tipo comune non puoi usarlo. Quindi, basta usare un normale if dichiarazione:

if (booleanValue) 
    MyClassInstance->Foo(24); 
else 
    MyClassInstance->Foo("a string"); 
5

No. Per eseguire la risoluzione di sovraccarico il compilatore chiederà "qual è il tipo di booleanValue?24:"a string"?". Quella domanda non può essere risolta.

+0

Non si può rispondere * al momento della compilazione * (non è il mio voto negativo - solo facendo un piccolo suggerimento per migliorare la risposta) –

+0

@Paul Nelle espressioni C++ hanno solo tipi a compilazione tempo. Non ha senso parlare di qualcos'altro. –

+0

Sì, lo so, il punto è che è * concepibile * che è possibile determinare quale funzione chiamare dinamicamente, vale a dire in fase di esecuzione, ma per C++ è necessario conoscere il tipo in fase di compilazione. –

7

Il tipo di un'espressione condizionale ternario è il tipo comune due che entrambi gli operandi sono con ­ ver ­ Tible. Si può sicuramente non eseguire "risoluzione di sovraccarico dinamico", come sembra suggerire.

Poiché non esiste un tipo comune per int e char const *, il codice non verrà nemmeno compilato (come si è certi che ­ si è notato durante il test).

(Si può essere felici di sapere che il condizionale ternario è usato proprio a causa di quelle semantica nella realizzazione del modello di classe std::common_type caratteristica, insieme a decltype.)

(Se la condizione è nota staticamente , come ad esempio sizeof(int) != 7, quindi è possibile utilizzare template spe ­ cia ­ lization di scrivere codice simile aspetto che fa eseguire la risoluzione di sovraccarico condizionale, ma naturalmente in modo statico.)

5

No, questo non è permesso.

I sovraccarichi sono in fase di compilazione, quindi non può funzionare in runtime in questo modo.

non è comune nel codice che si vorrebbe fare esattamente questo, però a volte con iostream v'è il desiderio di fare qualcosa di simile:

os << (condition ? var1 : var2)

dove var1 e var2 hanno tipi differenti. Anche questo non funziona.

Si potrebbe fare:

MyClassInstance->Foo(booleanValue ? boost::any(24) : boost::any("a string"));