我有一個名爲ABC類,它有一個類模板:C++採用指針模板對象
template <class T> class ABC{}
在另一類我試圖對象的商店ABC中的列表:
class CDE{
private:
list<ABC *> some_list;
}
我打算存儲可能具有不同類模板參數的ABC對象。是否有必要在編譯時指定模板?如果容器應該存儲不同類型的對象呢?這不可能嗎?
我有一個名爲ABC類,它有一個類模板:C++採用指針模板對象
template <class T> class ABC{}
在另一類我試圖對象的商店ABC中的列表:
class CDE{
private:
list<ABC *> some_list;
}
我打算存儲可能具有不同類模板參數的ABC對象。是否有必要在編譯時指定模板?如果容器應該存儲不同類型的對象呢?這不可能嗎?
是否有必要甚至在編譯時指針指定模板?
是。
如果容器應該存儲不同類型的對象會怎麼樣?這不可能嗎?
它不是(直接)可能的。
有沒有這樣的事情,類ABC。只有ABC的實例化,例如ABC<Foo>
和ABC<Bar>
。這些是完全不同的類。
你可以這樣做:
template<typename T>
class ABC : public ABC_Base
{
...
}
list<ABC_Base*> some_list;
通過這樣做,你的所有ABC實例都有一個共同的基本類型,你可以任意使用基本指針。
您需要在CDE
類中指定模板參數,或者使CDE
爲模板。
第一種選擇:
class CDE {
private:
list< ABC<int>* > some_list;
};
第二個選項:
template <class T>
class CDE {
private:
list< ABC<T>* > some_list;
};
該列表只能存儲單個類型。模板的不同實例是不同的類型。如果這是令人滿意的,你可以做這樣的:
template <class T> class CDE{ private: list<ABC<T> *> some_list; }
如果您需要使用不同的類型,也許你可以創建一個ABC和存儲指向一個非模板基類。 (即使用接口)
這聽起來很合理,有一點缺點。使用模板的全部原因是確保對象緊密耦合。這樣,仍然有機會創建沒有模板類型的ABC_Base(或其派生類)對象並在列表中使用它們。 – cyrux
@cyrux如果你創建了'ABC_Base'抽象,那麼沒有人可以創建'ABC_Base'的對象。 – user470379