Tôi không chắc liệu tiêu đề câu hỏi có chính xác không ... Hãy để tôi bắt đầu bằng cách giải thích kịch bản đơn giản ban đầu của tôi, và sau đó chuyển sang giải thích những gì tôi muốn làm, nhưng không thể.Tính đa hình kiểu trả về cho giá trị
Nguyên, tôi đã có cái gì đó như:
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]());
Cho đến nay rất tốt (tôi nghĩ). Tuy nhiên, hiện có một số loại toán hạng có nguồn gốc, ví dụ: class RegisterOperand : public Operand
. Tôi có các hàm mới, chuyên dụng genOperand
lý tưởng sẽ trả lại các trường hợp của các kiểu có nguồn gốc. Nhưng tôi không thể làm điều này:
Operand genOperandC() { ...; return RegisterOperand(); }
và tôi không thể làm điều này:
RegisterOperand genOperandC() { ...; return RegisterOperand(); }
static const OpGen generators[] =
{
...
genOperandC,
};
Tuy nhiên, tôi biết điều này sẽ làm việc nếu tôi được trở lại tham chiếu hoặc con trỏ loại, vì vậy chỉ tùy chọn Tôi hiện có là một cái gì đó như:
Operand *genOperandC() { ...; return new RegisterOperand(); }
hiện yêu cầu dọn dẹp rõ ràng không cần thiết ban đầu.
Bất kỳ lựa chọn thay thế nào mà tôi chưa xem xét?
Sử dụng 'boost :: make_shared' thay vì tự tạo con trỏ được chia sẻ, đó là phương thức trình bao đơn giản nhưng giảm số lượng phân bổ bộ nhớ cần thiết (và do đó nhanh hơn) –