के लिए रिटर्न-टाइप पॉलीमोर्फिज्म मुझे यकीन नहीं है कि प्रश्न शीर्षक सटीक है ... मुझे अपना मूल सरल परिदृश्य समझाकर शुरू करें, और फिर मुझे यह बताने के लिए आगे बढ़ें कि मैं क्या करना चाहूंगा, लेकिन नहीं कर सकतापास-बाय-वैल्यू
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(); }
जो अब स्पष्ट सफाई जो मूल रूप से आवश्यक नहीं था की आवश्यकता है: विकल्प मैं वर्तमान में है की तरह कुछ है।
कोई भी विकल्प जिस पर मैंने विचार नहीं किया है?
साझा पॉइंटर स्वयं बनाने के बजाय 'boost :: make_shared' का उपयोग करें, यह एक साधारण रैपर विधि है लेकिन आवश्यक स्मृति आवंटन की संख्या को कम करें (और इस प्रकार तेज़ है) –