No estoy seguro de si el título de la pregunta es correcto ... Permítanme comenzar explicando mi escenario simple original, y luego paso a explicar qué me gustaría hacer, pero no puedoPolimorfismo de devolución para el valor por transferencia
Originalmente, tenía algo así como:
class Operand;
Operand genOperandA() { ...; return Operand(); }
Operand genOperandB() { ...; return Operand(); }
... // more operand-generation functions
typedef Operand (*OpGen)();
// Table of function pointers
static const OpGen generators[] =
{
genOperandA,
genOperandB,
...
};
// Function to do some operation on the operand
void operate(Operand& op);
...
// Example call
operate(generators[1]());
Hasta aquí todo bien (creo). Sin embargo, ahora hay varios tipos de operandos derivados, p. class RegisterOperand : public Operand
. Tengo nuevas funciones genOperand
dedicadas que idealmente devolverían instancias de los tipos derivados. Pero no puedo hacer esto:
Operand genOperandC() { ...; return RegisterOperand(); }
y yo no puedo hacer esto:
RegisterOperand genOperandC() { ...; return RegisterOperand(); }
static const OpGen generators[] =
{
...
genOperandC,
};
Sin embargo, sé que esto funcionaría si tuviera que volver tipos de referencia o puntero, por lo que el único La opción que tengo actualmente es algo así como:
Operand *genOperandC() { ...; return new RegisterOperand(); }
que ahora requieren una limpieza explícita que no era necesaria originalmente.
¿Alguna alternativa que no haya considerado?
Use 'boost :: make_shared' en lugar de crear el puntero compartido usted mismo, es un método simple de envoltura pero reduce el número de asignaciones de memoria necesarias (y por lo tanto es más rápido) –