मैं वर्तमान की तरहसी ++ अंतर्निहित टेम्पलेट इन्स्टेन्शियशन
MatrixBase -> DenseMatrix
-> (other types of matrices)
-> MatrixView -> TransposeView
-> DiagonalView
-> (other specialized views of matrices)
MatrixBase
एक वर्ग पदानुक्रम है एक अमूर्त वर्ग जो इसको लागू करने के लिए मजबूर ऑपरेटर() (पूर्णांक, पूर्णांक) और इस तरह की चीजों को परिभाषित करने के लिए; यह संख्याओं के 2 आयामी सरणी का प्रतिनिधित्व करता है। MatrixView
एक मैट्रिक्स को देखने की एक (संभावित रूप से परिवर्तनीय) तरीका का प्रतिनिधित्व करता है, जैसे इसे ट्रांसपोज़ करना या सबमिट्रिक्स लेना। MatrixView
की बात कहने के लिए सक्षम होने के लिए है कुछ
Scale(Diagonal(A), 2.0)
जहां Diagonal
रिटर्न एक DiagonalView
वस्तु जो हल्के अनुकूलक का एक प्रकार है।
अब प्रश्न (प्रश्न) है। मैं एक उदाहरण के रूप में एक बहुत ही सरल मैट्रिक्स ऑपरेशन का उपयोग करूंगा। मैं
template <class T>
void Scale(MatrixBase<T> &A, const T &scale_factor);
जैसे किसी फ़ंक्शन को परिभाषित करना चाहता हूं जो नाम स्पष्ट सुझाव देता है। मैं या तो ईमानदार-से-भलाई नॉन-व्यू मैट्रिक्स, या MatrixView
के उप-वर्ग का उदाहरण प्राप्त करने में सक्षम होना चाहता हूं। ऊपर लिखा के रूप में इस तरह के प्रोटोटाइप
Scale(Diagonal(A), 2.0);
के रूप में बयान के लिए काम नहीं करता है क्योंकि DiagonalView
वस्तु Diagonal
द्वारा लौटाए गए एक अस्थायी है, और Scale
एक गैर स्थिरांक संदर्भ है, जो एक अस्थायी स्वीकार नहीं कर सकते लगता है। क्या यह काम करने का कोई तरीका है? मैंने SFINAE का उपयोग करने की कोशिश की, लेकिन मुझे यह सब ठीक नहीं समझ रहा है, और मुझे यकीन नहीं है कि इससे समस्या हल हो जाएगी। मेरे लिए यह महत्वपूर्ण है कि इन टेम्पलेट किए गए कार्यों को स्पष्ट टेम्पलेट तर्क सूची प्रदान किए बिना बुलाया जा सके (मुझे निहित तत्कालता चाहिए)। आदर्श रूप से ऊपर दिया गया बयान लिखित के रूप में काम कर सकता है।
संपादित करें: (अनुवर्ती प्रश्न)
के रूप में भारतीय स्टेट बैंक rvalue संदर्भ और temporaries के बारे में नीचे से जवाब दिया, वहाँ स्केल के दो संस्करणों को परिभाषित करने का कोई तरीका है, जिसके लिए एक गैर स्थिरांक rvalue संदर्भ लेता है गैर-विचार, और एक जो पास-दर-मूल्य दृश्य लेता है? समस्या इन दोनों के बीच संकलित समय पर अंतर करने के लिए है कि निहित तत्काल कार्य करेगा।
अद्यतन
मैं
ReadableMatrix
WritableMatrix : public ReadableMatrix
WritableMatrixView
DenseMatrix : public WritableMatrix
DiagonalView : public WritableMatrixView
कारण WritableMatrixView
WritableMatrix
से अलग है यह है कि दृश्य स्थिरांक संदर्भ द्वारा चारों ओर पास किया जाना चाहिए करने के लिए वर्ग पदानुक्रम बदल दिया है, जबकि मेट्रिसिस को स्वयं को गैर-कॉन्स रेफरी द्वारा पारित किया जाना चाहिए, इसलिए एक्सेसर सदस्य फ़ंक्शंस में अलग-अलग कॉन्स्टेस होते हैं। अब स्केल जैसे कार्यों के दो संस्करणों, एक स्थिरांक देखने के लिए, और वास्तविक मैट्रिक्स के लिए एक गैर स्थिरांक संस्करण देखते हैं कि के रूप में
template <class T>
void Scale(const WritableMatrixView<T> &A, const T &scale_factor);
template <class T>
void Scale(WritableMatrix<T> &A, const T &scale_factor){
Scale(WritableMatrixViewAdapter<T>(A), scale_factor);
}
नोट में परिभाषित किया जा सकता है। इसका मतलब Mult(A, B, C)
जैसे कार्यों के लिए है, मुझे 8 ओवरलोड की आवश्यकता होगी, लेकिन कम से कम यह काम करता है। क्या काम नहीं करता है, हालांकि इन कार्यों का उपयोग अन्य कार्यों के भीतर कर रहा है।आप देखते हैं, प्रत्येक View
-like वर्ग में सदस्य View
है जो यह देख रहा है; उदाहरण के लिए Diagonal(SubMatrix(A))
अभिव्यक्ति में, Diagonal
फ़ंक्शन DiagonalView<SubMatrixView<T> >
प्रकार का ऑब्जेक्ट देता है, जिसे पूरी तरह से व्युत्पन्न प्रकार A
पता होना चाहिए। अब, मान लें कि Scale
में मैं कुछ अन्य फ़ंक्शन को कॉल करता हूं, जो या तो मूल दृश्य या मैट्रिक्स संदर्भ लेता है। यह असफल हो जाएगा क्योंकि आवश्यक View
के निर्माण के लिए स्केल के तर्क के व्युत्पन्न प्रकार की आवश्यकता होती है; जानकारी नहीं है। अभी भी इसका समाधान ढूंढने पर काम कर रहे हैं।
अद्यतन
मैं का इस्तेमाल किया है क्या प्रभावी ढंग से Scale
की तरह एक समारोह के दो विभिन्न संस्करणों के बीच चयन करने के लिए बूस्ट के enable_if की एक देसी संस्करण है। यह मेरे सभी मैट्रिक्स को लेबल करने और अतिरिक्त टाइपिफ़ टैग वाले वर्गों को देखने के लिए उबलता है जो इंगित करता है कि क्या वे पठनीय और लिखने योग्य और दृश्यमान हैं या न देखे जा सकते हैं। अंत में, मुझे अभी भी 2^एन अधिभार की आवश्यकता है, लेकिन अब एन केवल गैर-कॉन्स्ट तर्कों की संख्या है। अंतिम परिणाम के लिए, here देखें (यह गंभीरता से फिर से सुधारने की संभावना नहीं है)।
कोई विशेष कारण क्यों स्केल() कॉन्स्ट संदर्भ द्वारा पैरामीटर स्वीकार नहीं करता है? – Naveen
स्केल वास्तव में इसके तर्क को स्केल करना चाहिए, इस प्रकार यह स्थिर नहीं हो सकता है। –
स्केल अस्थायी मैट्रिक्स को क्यों संशोधित करता है? –