Я не уверен, правильно ли задан вопрос... Позвольте мне начать с объяснения моего первоначального простого сценария, а затем перейду к объяснению, что бы я хотел сделать, но не могу.
Первоначально у меня было что-то вроде:
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(); }
который теперь требует явной очистки, которая изначально не требовалась.
Любые альтернативы, которые я не рассматривал?