मुझे कुछ जटिल वस्तुओं के लिए मूल अंकगणितीय ऑपरेटरों को अधिभारित करना होगा। अब तक, मैंने सफलतापूर्वक operator*
लागू किया है; अब मुझे operator+
आदि की आवश्यकता है। operator*
के लिए कोड बहुत बड़ा है, लेकिन operator*
और operator+
के बीच एकमात्र अंतर एक पंक्ति होगी जहां मैं कुछ जटिल संख्याओं पर *
के बजाय +
का उपयोग करता हूं। यह लाइन एक लूप के अंदर होगी जिसे कई बार बुलाया जाता है, इसलिए मैं इसे कुशल बनाना चाहता हूं, जो कि फ़ंक्शन पॉइंटर्स को इंगित नहीं करता है। (अगर मैं गलत हूं तो मुझे सही करें।)फ़ंक्शन टेम्पलेट पैरामीटर के रूप में पास ऑपरेटर
यह टेम्पलेट्स के लिए एकदम सही उपयोग की तरह लगता है। लेकिन मैं सही वाक्यविन्यास के रूप में एक नुकसान में हूँ। मैं कुछ इस तरह सोच रहा हूँ ComplicatedObject
वर्ग परिभाषा के अंदर:
template <typename ComplexBinaryOp>
ComplicatedObject BinaryOp(const ComplicatedObject& B) const {
// Do lots of stuff
for(unsigned int i=0; i<OneBazillion; ++i) {
// Here, the f[i] are std::complex<double>'s:
C.f[i] = ComplexBinaryOp(f[i], B.f[i]);
}
// Do some more stuff
return C;
}
inline ComplicatedObject operator*(const ComplicatedObject& B) const {
return BinaryOp<std::complex::operator*>(B);
}
inline ComplicatedObject operator+(const ComplicatedObject& B) const {
return BinaryOp<std::complex::operator+>(B);
}
इस सवाल से संबंधित है: "function passed as template argument"। लेकिन टेम्पलेट तर्क के रूप में पारित कार्य ऑपरेटर नहीं हैं।
मैंने सिंटैक्स के साथ हर तरह से विचार किया है, लेकिन संकलक हमेशा खराब वाक्यविन्यास की शिकायत करता है। मुझे यह कैसे करना चाहिए?
संपादित करें:
स्पष्टता के लिए, मैं ऊपर मेरी कोड के मामले में पूर्ण समाधान, अतिरिक्त सामान्यीकरण के साथ-साथ लोगों की आवश्यकता हो सकती में शामिल हैं:
template <typename ComplexBinaryOp>
ComplicatedObject BinaryOp(const ComplicatedObject& B) const {
// Do lots of stuff
for(unsigned int i=0; i<OneBazillion; ++i) {
// Here, the f[i] are std::complex<double>'s:
C.f[i] = ComplexBinaryOp()(f[i], B.f[i]); // Note extra()'s
}
// Do some more stuff
return C;
}
inline ComplicatedObject operator+(const ComplicatedObject& B) const {
return BinaryOp<std::plus<std::complex<double> > >(B);
}
inline ComplicatedObject operator-(const ComplicatedObject& B) const {
return BinaryOp<std::minus<std::complex<double> > >(B);
}
inline ComplicatedObject operator*(const ComplicatedObject& B) const {
return BinaryOp<std::multiplies<std::complex<double> > >(B);
}
inline ComplicatedObject operator/(const ComplicatedObject& B) const {
return BinaryOp<std::divides<std::complex<double> > >(B);
}
'std :: complex' एक क्लास टेम्पलेट है, इसलिए आपको' std :: complex 'की आवश्यकता है। लेकिन फिर भी, 'जटिल :: ऑपरेटर * 'और' जटिल :: ऑपरेटर + 'सदस्य कार्य * हैं। आप इसे संचालित करने के लिए 'जटिल ' के उदाहरण के बिना बस उन्हें पास नहीं कर सकते हैं। –
Praetorian
पोस्ट त्रुटियां जो आप प्राप्त कर रहे हैं। दिलचस्प प्रश्न के लिए –
+1। मुझे यह प्रश्न भी मिला - [सी ++ पॉइंटर्स ऑपरेटरों के लिए] (http://stackoverflow.com/questions/4176895/c-pointers-to-operators) प्रासंगिक और दिलचस्प। – keelar