2011-06-20 11 views
5

मैं बूस्ट एमपीएल :: वेक्टर में निहित कक्षाओं के एक सेट से उत्तराधिकारी बनना चाहता हूं। क्या यह संभव है?मेटा-प्रोग्रामिंग: बूस्ट एमपीएल में प्रत्येक वर्ग से प्राप्त होता है :: वेक्टर

विशेष रूप से, मैं test को मनमाने ढंग से कई टेम्पलेट पैरामीटर के लिए विस्तारित करना चाहता हूं, जो एमपीएल :: वेक्टर के रूप में पारित किया गया है।

template<class T> 
struct Slice 
{ 
public: 
    virtual void foo(T v) const = 0; 
}; 

struct A{}; 
struct B{}; 

template <class T1, class T2> 
struct test : public Slice<T1>, public Slice<T2> 
{ 
    void foo(T1 a) const {std::cout<<"A"<<std::endl;} 
    void foo(T2 b) const {std::cout<<"B"<<std::endl;} 
}; 

तो मैं जानता हूँ कि केवल दो पैरामीटर तो मैं बस लिख सकते हैं देखते हैं:

template <class mpl_vector_t > 
struct test : public Slice<typename mpl::at<mpl_vector_t,mpl::int_<0> >::type >, 
      public Slice<typename mpl::at<mpl_vector_t,mpl::int_<1> >::type > 
{ 
    typedef typename mpl::at<mpl_vector_t,mpl::int_<0> >::type T1; 
    typedef typename mpl::at<mpl_vector_t,mpl::int_<1> >::type T2; 

    void foo(T1 a) const {std::cout<<"A"<<std::endl;} 
    void foo(T2 b) const {std::cout<<"B"<<std::endl;} 
}; 

है एक मनमाना एमपीएल :: वेक्टर के लिए यह करने के लिए संभव है?

मेरे परीक्षण कार्यक्रम तो दिखाई देता है:

int 
main (int ac, char **av) 
{ 
    A a; 
    B b; 
    // test<A,B> t; //original 
    test<mpl::vector<A,B> > t; //mpl::vector with 2 elements 
    Slice<A>* Sa = &t; 
    Slice<B>* Sb = &t; 
    Sa->foo(a); 
    Sb->foo(b); 
} 
+1

इंटरफ़ेस विरासत, एकल विरासत, एकाधिक वंशानुक्रम, _promiscuous_ विरासत :) अगर केवल ATL के डिजाइनर था TMP/एमपीएल उपयोग करना चाहते हैं : _) – sehe

+0

@sehe नाइस, मैं अपनी शब्दावली में "विशिष्ट विरासत" जोड़ रहा हूं: पी – AJG85

उत्तर