[英]Design for using all subclasses together in a container in C++
我剛剛讀了一篇有關“好奇重復模板模式”的文章。 您可以使用它來模擬帶有模板的虛擬功能。
例如:
template<class T>
struct A
{
void func() { static_cast<T*>(this)->func(); }
};
struct B : public A<B>
{
void func() { cout << "B" << endl; }
};`
但是,如果我們有許多來自A的子類,並希望將它們全部放入vector中,例如, vector<A*>
*>,則在使用模板時是不可能的,並且必須在基類中對虛擬函數使用正常的多態性。
解決該問題的設計建議是什么? 因為我要使用模板,而且還能夠在容器中一起使用所有子類。
您可以這樣做:
class NonTemplateBase
{
};
template<class T>
struct A : public NonTemplateBase
{
void func() { static_cast<T*>(this)->func(); }
};
然后創建一個指向NonTemplateBase
的指針的向量(即std::vector<NonTemplateBase *>
)。
但是,我猜想您希望能夠對vector中的對象調用func()
或其他成員函數,並且希望這些調用多態地調用派生類中的正確成員函數。
這是行不通的,因為好奇地重復發生的模板模式僅允許您執行靜態 (即編譯時)多態性。 如果要運行時多態,則必須使用虛函數。
為您的模板類定義一個非模板抽象基類。 使用基類處理容器。
讓所有模板實現一個通用接口,並創建指向該接口的指針或引用的向量。
class Icommon //interface
{
public:
virtual void print() = 0;
};
template <class T>
class MyCommon : public Icommon
{
T obj;
public:
MyCommon(T o):obj(o) {}
void print() {cout << obj;}
};
main()
{
MyCommon<int> i(1);
MyCommon<char> c('t');
vector<Icommon *> commonVec;
commonVec.push_back(&i);
commonVec.push_back(&c);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.