Я наткнулся на проблему, которая, на первый взгляд, легко превалирует, но при тщательном изучении этого не происходит.
В моей программе есть элементы, которые мне понадобятся для работы со многими типами, поэтому я решил обработать их универсальным расширяемым способом:
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 *.
Так как мне решить эту проблему? Какой шаблон дизайна или шаблонная хитрость могут помочь мне здесь?