मैं बूस्ट एमपीएल :: वेक्टर में निहित कक्षाओं के एक सेट से उत्तराधिकारी बनना चाहता हूं। क्या यह संभव है?मेटा-प्रोग्रामिंग: बूस्ट एमपीएल में प्रत्येक वर्ग से प्राप्त होता है :: वेक्टर
विशेष रूप से, मैं 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);
}
इंटरफ़ेस विरासत, एकल विरासत, एकाधिक वंशानुक्रम, _promiscuous_ विरासत :) अगर केवल ATL के डिजाइनर था TMP/एमपीएल उपयोग करना चाहते हैं : _) – sehe
@sehe नाइस, मैं अपनी शब्दावली में "विशिष्ट विरासत" जोड़ रहा हूं: पी – AJG85