आप स्रोत वर्गों 'डिजाइन बदलने में सक्षम हैं, तो आप पूरी तरह से गतिशील बहुरूपता (जो आभासी कार्यों का उपयोग करता जगह ले सकता है) स्थिर बहुरूपता के साथ और प्रयोग CRTP idiom:
template <class TDerived>
class Base
{
public:
int getSize()
{ return sizeof(TDerived); }
void print()
{
std::cout
<< static_cast<TDerived*>(this)->getSize()
<< std::endl;
}
int some_data;
};
class Derived : public Base<Derived>
{
public:
int some_other_data1;
int some_other_data2;
};
class AnotherDerived : public Base<AnotherDerived>
{
public:
int getSize()
{ return some_unusual_calculations(); }
// Note that the static_cast above is required for this override to work,
// because we are not using virtual functions
};
int main()
{
Derived d;
d.print();
AnotherDerived ad;
ad.print();
return 0;
}
आप के बाद से CRTP लचीलापन नहीं है जब जरूरत बहुरूपी व्यवहार कार्यक्रम केsizeof
मामले की तरह संकलन समय() पर निर्धारित किया जा सकता कर सकते हैं, गतिशील बहुरूपता का रन-टाइम पर वांछित वस्तु को हल करने के लिए।
स्थिर पॉलीमोर्फिज्म को आभासी-फ़ंक्शन-कॉल ओवरहेड को हटाकर उच्च प्रदर्शन का लाभ भी है।
यदि आप बेस क्लास को टेम्पलेट करना नहीं चाहते हैं या आपको एक ही स्थान (जैसे सरणी या वेक्टर) में बेस क्लास के विभिन्न व्युत्पन्न उदाहरणों को रखने की आवश्यकता है, तो आप एक मध्यम वर्ग पर सीआरटीपी का उपयोग कर सकते हैं और पॉलीमोर्फिक को ले जा सकते हैं (विकिपीडिया में Polymorphic copy construction example के समान) है कि कक्षा में व्यवहार:
class Base
{
public:
virtual int getSize() = 0;
void print()
{
std::cout << getSize() << std:endl;
}
int some_data;
};
template <class TDerived>
class BaseCRTP: public Base
{
public:
virtual int getSize()
{ return sizeof(TDerived); }
};
class Derived : public BaseCRTP<Derived>
{
// As before ...
};
class AnotherDerived : public BaseCRTP<AnotherDerived>
{
// As before ...
// Note that although no static_cast is used in print(),
// the getSize() override still works due to virtual function.
};
Base* obj_list1[100];
obj_list1[0] = new Derived();
obj_list1[2] = new AnotherDerived();
std::vector<Base*> obj_list2;
obj_list2.push_back(new Derived());
obj_list2.push_back(new AnotherDerived());
-
अद्यतन: मैं अब पाया एक समान है, लेकिन stackoverflow पर अधिक विस्तृत answer जो बताते हैं कि यदि हमें और अधिक व्युत्पन्न से निकाले जाते हैं उपरोक्त वर्ग (जैसे class FurtherDerived : public Derived {...}
), sizeof
नहीं होगा सही ढंग से रिपोर्ट करें। वह इस पर काबू पाने के लिए कोड के more complex variant देता है।
स्रोत
2013-02-06 13:23:06
वर्चुअल फ़ंक्शन को जोड़ने के बिना वास्तव में ऐसा करने के लिए वैसे भी नहीं है। आपको कक्षाओं के आकार को जानने की आवश्यकता क्यों है? – jmucchiello