También podría devolver una clase/estructura con alguna conversión mágica que sea útil para su necesidad especial.
Ejemplo de vida real: una vez tuve que devolver dos piezas de información en el mismo valor devuelto, un valor para informar si un mensaje de ventana había sido procesado por completo y el valor devuelto si el procesamiento ya estaba terminado. Así que empaqué todo en una clase como esta:
//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;
};
};
Esto me permitió hacer simplemente return false;
en una función que devuelve un MessageReturnValue si el mensaje aún no se había procesado, o para return TRUE/15/whatever;
si el mensaje había sido completamente procesado y ya tuve un valor de retorno. La persona que llama, por su parte, sólo podía hacer
LRESULT MyWndProc(/* blah blah blah */)
{
MessageReturnValue ret = MyFunction(/* blah blah blah */);
if(!ret)
{
/* process the message */
return /* something */;
}
else
return (LRESULT)ret;
}
Si tiene necesidades más complejas, también se puede considerar el uso de impulso :: tupla.
Puede ser que te ayude si explicas por qué quieres hacer esto, entonces podemos estar seguros de que te estamos asesorando correctamente. –
@Tom: esta es una pregunta simplificada, pero estoy tratando de implementar una función get para una cola que "no hará nada" si la cola está vacía. – Brandon