मैं समझ नहीं पा रहा हूं कि टेम्पलेट फ़ंक्शन कैसे लिखना है जो वेक्टर और मैट्रिक्स कॉलम दोनों को स्वीकार करता है?

उदाहरण के लिए:

template<typename T>
void foo(
    const Eigen::MatrixX<T>& M){

}

int main(){
  Eigen::VectorX<double> v(3);
  Eigen::MatrixX<double> m(4,3);

  foo(m); // fine
  foo(m.col(0)); // broken
  foo(m.row(0)); // broken
  foo(v); // broken
}

केवल foo(m); ही ठीक है।

मैंने उदाहरण देखे हैं जो पूर्वनिर्धारित प्रकारों के साथ ऐसा करते हैं और मैंने देखा है टेम्प्लेट एक्सप्लोर करने वाले उदाहरण। उनमें से कोई भी यह नहीं दिखाता है कि वर्णित कार्य को टेम्पलेट फ़ंक्शन के साथ कैसे हल किया जाए।

संपादित करें: इसके अलावा, मैं गतिशील आकार वेक्टर पास करना चाहता हूं, लेकिन आवश्यक नहीं, निश्चित आकार

1
Kerim 8 जिंदा 2021, 21:01
पहली दो टूटी लाइन के लिए foo(m.block<4,1>(0,0)); और foo(m.block<1,3>(0,0)); का प्रयोग करें।
 – 
wcochran
8 जिंदा 2021, 21:18
काम नहीं करता... "'foo' कॉल के लिए कोई मिलान फ़ंक्शन नहीं"। इसके अलावा, मैं निश्चित आकार की ब्लॉक सीमा (संपादित प्रश्न) के कारण गतिशील आकार के वैक्टर पास करना चाहता हूं
 – 
Kerim
8 जिंदा 2021, 21:43

1 उत्तर

सबसे बढ़िया उत्तर

मैं इसे MatrixBase का उपयोग करके काम पर ला सकता हूं:

#include <Eigen/Dense>

template<typename T>
void foo(const Eigen::MatrixBase<T>& M){}

int main(){
    Eigen::Vector3d v(3);
    Eigen::Matrix<double,4,3> m(4,3);
    Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic> q(5,6);

    foo(m);
    foo(m.col(0));
    foo(m.row(0));
    foo(v);
    foo(q);
}
2
wcochran 8 जिंदा 2021, 22:00