Я не уверен, что заголовок вопроса точен ... Позвольте мне начать с объяснения моего первоначального простого сценария, а затем перейти к объяснению того, что я хотел бы сделать, но не могу.
Изначально у меня было что-то вроде:
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]());
Пока все хорошо (я думаю).Однако теперь есть несколько производных типов операндов, например class RegisterOperand : public Operand
.У меня есть новые, выделенные genOperand
функции, которые в идеале должны возвращать экземпляры производных типов.Но я не могу сделать это:
Operand genOperandC() { ...; return RegisterOperand(); }
, и я не могу сделать это:
RegisterOperand genOperandC() { ...; return RegisterOperand(); }
static const OpGen generators[] =
{
...
genOperandC,
};
Однако я знаю, что это сработало бы, если бы я возвращал ссылочные или указательные типытак что единственный вариант, который у меня сейчас есть, это что-то вроде:
Operand *genOperandC() { ...; return new RegisterOperand(); }
, который теперь требует явной очистки, которая изначально не требовалась.
Какие альтернативы я не рассматривал?