Puoi anche restituire una classe/struttura con una conversione magica utile per le tue esigenze speciali.
esempio reale di vita: una volta ho avuto in realtà tornare due pezzi di informazioni nello stesso valore di ritorno, un valore di segnalare se un messaggio finestra era stata completamente elaborato e il valore da restituire per esso se il trattamento era già completato. Così ho confezionato tutto in una classe come questa:
//This class is used to carry a return value for a window message and a value that indicates if the
//message has already been completely processed
class MessageReturnValue
{
public:
LRESULT returnValue;
bool processed;
MessageReturnValue()
{
processed=false;
returnValue=FALSE;
};
MessageReturnValue(LRESULT ReturnValue)
{
processed=true;
returnValue=ReturnValue;
};
MessageReturnValue(bool Processed)
{
returnValue=FALSE;
processed=Processed;
};
inline operator bool()
{
return processed;
};
inline operator LRESULT()
{
return returnValue;
};
};
Questo mi ha permesso di fare proprio return false;
in una funzione che ha restituito un MessageReturnValue se il messaggio fosse ancora da trasformati, o per return TRUE/15/whatever;
se il messaggio fosse stato completamente elaborato e ho già avuto un valore di ritorno. Il chiamante, da parte sua, potrebbe semplicemente fare
LRESULT MyWndProc(/* blah blah blah */)
{
MessageReturnValue ret = MyFunction(/* blah blah blah */);
if(!ret)
{
/* process the message */
return /* something */;
}
else
return (LRESULT)ret;
}
Se avete esigenze più complesse, si potrebbe anche considerare l'utilizzo di boost :: tuple.
fonte
2010-02-17 08:31:54
Potrebbe aiutarti se spieghi perché vuoi farlo, quindi possiamo essere certi che ti stiamo avvisando correttamente. –
@ Tom: Questa è una domanda semplificata, ma sto cercando di implementare una funzione get per una coda che "non farà nulla" se la coda è vuota. – Brandon