簡體   English   中英

使用C ++在容器中一起使用所有子類的設計

[英]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 *> )。

但是,我猜想您希望能夠對v​​ector中的對象調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM