के रूप में ऑपरेटर मैं कक्षा में एक विकल्प सेट के आधार पर operator()
कई अलग-अलग तरीकों को लागू करना चाहता हूं। क्योंकि इसे बड़ी संख्या में बुलाया जाएगा, मैं शाखाओं के किसी भी चीज का उपयोग नहीं करना चाहता हूं। आदर्श रूप में, operator()
एक फ़ंक्शन पॉइंटर होगा जिसे विधि के साथ सेट किया जा सकता है। हालांकि, मुझे यकीन नहीं है कि यह वास्तव में कैसा दिखता है। मैंने कोशिश की:फ़ंक्शन पॉइंटर
#include <iostream>
class Test {
public:
int (*operator())();
int DoIt1() {
return 1;
}
int DoIt2() {
return 2;
}
void SetIt(int i) {
if(i == 1) {
operator() = &Test::DoIt1;
} else {
operator() = &Test::DoIt2;
}
}
};
int main()
{
Test t1;
t1.SetIt(1);
std::cout << t1() << std::endl;
t1.SetIt(2);
std::cout << t1() << std::endl;
return 0;
}
मैं जानता हूँ कि अगर मैं एक और समारोह सूचक बना सकते हैं और फोन है कि operator()
समारोह से यह काम करेंगे। लेकिन क्या operator()
फ़ंक्शन स्वयं एक फ़ंक्शन पॉइंटर होना संभव है? मैंने जो पोस्ट किया है उसके साथ कुछ (जो संकलित नहीं करता है)?
ऊपर कोड देता है:
test.cxx:5:21: error: declaration of ‘operator()’ as non-function
test.cxx: In member function ‘void Test::SetIt(int)’:
test.cxx:17:16: error: ‘operator()’ not defined
test.cxx:19:16: error: ‘operator()’ not defined
test.cxx: In function ‘int main()’:
test.cxx:30:19: error: no match for call to ‘(Test)()’
test.cxx:34:19: error: no match for call to ‘(Test)()’
' पूर्णांक (ऑपरेटर())():
यहाँ सी ++ 11 के लिए ही एक और समाधान है? – iammilind
एचआरएम, यह 'int (* ऑपरेटर())() होना चाहिए;' मुझे लगता है, लेकिन यह सिर्फ त्रुटियों का एक और सेट उठाता है। मैं कोड संपादित करूंगा। – tpg2114
"मैं शाखाओं के किसी भी चीज का उपयोग नहीं करना चाहता हूं। आदर्श रूप में, ऑपरेटर() एक फ़ंक्शन पॉइंटर होगा" - वास्तव में, प्रदर्शन प्रदर्शन के लिए शाखाएं बेहतर होती हैं। भविष्यवाणी करने के लिए आधुनिक सीपीयू की 50% सफलता दर से बेहतर है कि कौन सी शाखा ली जाएगी; फ़ंक्शन पॉइंटर्स कहीं भी इंगित कर सकते हैं और भविष्यवाणी तर्क पर बहुत कठिन हैं। – MSalters