Поскольку контейнер привязан к одному типу данных, которые он может содержать, вы можете создать класс 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
};
Изменить:
В какой-то момент вам придется решить, какой тип контейнера вершин вы хотите получить (мой подход) или что вы хотите делать с вершиной (подход Виджая Мэтью), а затем вы потребуется dynamic_cast‹>, чтобы получить доступ к методам производного класса.
Еще одно предложение:
Если типы так сильно отличаются, как вы описываете в своих комментариях, может быть лучше рассматривать их как разные типы.
Например, вы можете создать отдельный контейнер. для каждого экземпляра шаблона Geometry<>.
class SomeStorageClass
{
/* ... */
private:
std::vector< Geometry<Vertex1> > m_vertex1Geometries;
std::vector< Geometry<Vertex2> > m_vertex2Geometries;
};
Если у вас есть функции, которые работают с одним типом геометрии (используя Vertex1::GetPos(), если использовать ваш пример) или с другим (Vertex2::GetUV()), то эти функции, вероятно, реализованы совершенно по-разному и, таким образом, заслуживают того, чтобы быть отдельными функциями, ожидающими разные типы параметров.
person
foraidt
schedule
03.08.2010
GetVertices()возвращает неконстантную ссылку из константной функции? Это выглядит немного изворотливым для меня. - person Mike Seymour   schedule 03.08.2010