Je ne suis pas sûr que le titre de la question soit exact ... Permettez-moi de commencer par expliquer mon scénario simple original, puis passer à autre chose pour expliquer ce que je voudrais faire, mais ne peut pas.Polymorphisme de type retour pour la valeur de passage
A l'origine, j'avais quelque chose comme:
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]());
Jusqu'à présent si bon (je pense). Cependant, il existe maintenant plusieurs types d'opérandes dérivés, par ex. class RegisterOperand : public Operand
. J'ai de nouvelles fonctions dédiées genOperand
qui renverraient idéalement des instances des types dérivés. Mais je ne peux pas le faire:
Operand genOperandC() { ...; return RegisterOperand(); }
et je ne peux pas le faire:
RegisterOperand genOperandC() { ...; return RegisterOperand(); }
static const OpGen generators[] =
{
...
genOperandC,
};
Cependant, je sais que cela fonctionnerait si je devais retourner les types de référence ou pointeur, la seule option que j'ai actuellement est quelque chose comme:
Operand *genOperandC() { ...; return new RegisterOperand(); }
qui nécessite maintenant un nettoyage explicite qui n'était pas nécessaire à l'origine.
Des alternatives que je n'ai pas envisagées?
Utilisez boost: make_shared plutôt que de créer vous-même le pointeur partagé, c'est une méthode wrapper simple mais réduisez le nombre d'allocations de mémoire nécessaires (et donc plus rapide) –