Поскольку контейнер привязан к одному типу данных, которые он может содержать, вы можете создать класс GeometryBase
, из которого получены все Geometry<T>
, а затем сохранить GeometryBase
указатели в вашем контейнере.
struct GeometryBase
{
// Non-template methods might go here.
// Don't forget to declare the base class destructor virtual.
};
template <typename T> struct Geometry : public GeometryBase
{
// Template methods go here
};
Редактировать:
В какой-то момент вам придется решить, какой тип контейнера вершин вы хотите получить (мой подход) или , что вы хотите сделать с вершиной(Подход Vijay Mathew), а затем вам нужно будет dynamic_cast <>, чтобы получить доступ к методам производного класса.
Еще одно предложение:
Если типы различныкак вы описываете в своих комментариях, на самом деле может быть лучше рассматривать их как разные типы.
Например, вы можете создать отдельный контейнер для каждого Geometry<>
экземпляра шаблона.
class SomeStorageClass
{
/* ... */
private:
std::vector< Geometry<Vertex1> > m_vertex1Geometries;
std::vector< Geometry<Vertex2> > m_vertex2Geometries;
};
Если выесть функции, которые работают с одним типом геометрии (используя Vertex1::GetPos()
, если использовать ваш пример) или с другим (Vertex2::GetUV()
), тогда эти функции, вероятно, реализованы совершенно по-разному и, следовательно, заслуживают отдельной функции.ожидающие разные типы параметров.