我偶然發現了一個問題,這個問題一眼就可以輕鬆實現,但仔細研究似乎並不存在。當所有類型都不知道時,函數從基類中重載
我有我的計劃項目,我需要與許多類型的工作,所以我決定在一個通用的,可擴展的方式來處理這些:
class ItemBase
{
public:
virtual ~ItemBase() = 0 {}
// pure virtual class, some extra members
};
template<typename T>
class ItemT : public ItemBase
{
public:
ItemT(const T &data) : m_Data(data) {}
T m_Data;
};
我現在可以存儲在一個集合中的任何類型:
std::vector<ItemBase*> items;
這很好。現在我有我想保持從這個類單獨的GUI組件,所以我想生成取決於類型的GUI組件:
GuiComponent* BuildComponent(ItemT<int> &item)
{
// do whatever based on this type, the int is needed
}
GuiComponent* BuildComponent(ItemT<double> &item)
{
// do whatever based on this type, the double is needed
}
這幾乎是美麗的編碼。不幸的是它不起作用。由於此程序顯示:
std::vector<ItemBase*> m_Items;
m_Items.push_back(new ItemT<int>(3));
m_Items.push_back(new ItemT<double>(2.0));
BuildComponent(*m_Items[0]);
因爲m_Items [0]的類型爲ItemBase *。
那麼我該如何解決這個問題呢?什麼設計模式或模板欺騙可以幫助我在這裏?
您是否正在編譯時錯誤?運行時錯誤? – 2010-11-09 19:38:15
編譯時間「沒有重載可以轉換所有參數類型」 – DanDan 2010-11-09 19:40:42
好,首先,您的抽象聲明是不正確的。抽象聲明之後不應該有{}。 {}是派生類實現的。這也意味着你的ItemT類需要實現基類的析構函數。 – 2010-11-09 19:46:12