2015-01-29 4 views
5

मैं एक कोड अभिव्यक्ति की एक सौ इस तरह के बारे में है कि कारगर बनाने के लिए करना चाहते हैं:रनटाइम पर फ़ंक्शन को अधिभारित करना संभव है?

if(flag) 
    AddData(key, some_number); 
else 
    AddData(key, error_description); 

AddData कहाँ ओवरलोड हो गया है

bool AddData(int key, double value); 
bool AddData(int key, const char * error); 

के रूप में मैं इस तरह उपरोक्त कोड को व्यक्त करना चाहते हैं :

AddData(key, flag? some_number : error_description); 

जो, ज़ाहिर है, संकलन नहीं करेगा क्योंकि ध्वज का मान रनटाइम पर निर्धारित किया जाता है और AddData हस्ताक्षर संकलन समय पर निर्धारित किए जाने की आवश्यकता ।

तरह

bool AddData(int key, bool flag, double value, const char * error); 

कुछ में दोनों कार्यों के संयोजन और जो मानकों के उपयोग करने के लिए हल करने और जो अनदेखी करने के लिए काम करेंगे एक है, लेकिन यह सिर्फ सुंदर पर्याप्त नहीं लगती है।

इस प्रकार सवाल: क्या रनटाइम पर फ़ंक्शन ओवरलोडिंग को अधिक उचित तरीके से हल करना संभव है?

+0

'AddData (? कुंजी, झंडा some_number: error_description) ; 'AddData (कुंजी, ध्वज, some_number, error_description) के समान दिखता है; ' – Jarod42

+1

क्या यह महत्वपूर्ण है कि ऑनल y 'someNumber'/'त्रुटि डिस्क्रिप्शन' में से एक का मूल्यांकन किया जाता है?साथ ही, ध्वज प्रत्येक कॉल को एक अलग अभिव्यक्ति है? – Deduplicator

+0

आप फ़ंक्शन पॉइंटर्स का उपयोग कर सकते हैं। इनपुट के आधार पर, उपयुक्त फ़ंक्शन पॉइंटर को कम करें। –

उत्तर

0

एक धारणा यह देखते हुए कि प्रश्न में अभिव्यक्ति में प्रतीकों में से कोई भी बाहर कारक जा सकता है, सबसे अच्छा आप मिल जाएगा है

AddData(key, flag, some_number, error_description) 

आप इसे इस तरह है कि शायद flag एकाधिक कॉल पर लागू होता है कारक कर सकते हैं, तो आप

Adder<flag>{} 
    .AddData(key1, val1, error1) 
    .AddData(key2, val2, error2) 
    .AddData(...) 
    . 
    . 

Ie जैसे संरचना के साथ बेहतर प्रदर्शन करना शुरू कर सकते हैं Ie एक 'धाराप्रवाह' इंटरफ़ेस जो याद करता है कि if के किनारे हर बार लिया जा रहा है।

2

बस समारोह में एक छोटे से सहायक को परिभाषित है, और उस का उपयोग करें:

auto AddHelper = [flag](int key, double value, const char* error) { 
    return flag ? AddData(key, value) : AddData(key, error); 
} 

के लिए संकलक पर निर्भर:

auto AddHelper = [](bool flag, int key, double value, const char* error) { 
    return flag ? AddData(key, value) : AddData(key, error); 
} 

झंडा वास्तव में हमेशा एक ही है, तो है कि एक साधारण परिवर्तन है अनुकूलन।

+0

+1 दूसरे incantation के लिए +1 (मैं शर्त' ध्वज 'पैरेंट समारोह के जीवनकाल पर स्थिर है)। यह काफी छोटा है और इसका सही इरादा है। –

1

सैकड़ों आईएसएस के बजाय आप पॉलिमॉर्फिज्म का उपयोग करना बेहतर हो सकते हैं।

ध्वज के बजाय एक बहुलक आधार वर्ग है जो डेटा जोड़ता है और ध्वज बदलने के बजाय आपने सही व्युत्पन्न वर्ग चुना है।

बुला कोड तो बस होगा:

data_adder->add(key, value, error_description); 

उदाहरण आधार वर्ग और व्युत्पन्न वर्ग:

struct DataAdder { 
    virtual void add(int key, double value, const char *error) = 0; 
protected: 
    ~DataAdder(){}; 
}; 

struct ValueDataAdder : DataAdder { 
    void add(int key, double value, const char*) override { AddData(key, value); } 
}; 

struct ErrorDataAdder : DataAdder { 
    void add(int key, double, const char* error) override { AddData(key, error); } 
}; 

Live demo

संबंधित मुद्दे