Избегайте виртуальных шаблонов

У меня возникли некоторые проблемы с C ++: у меня есть класс Primitive, он содержит переменную-член абстрактного буферного класса ..

Конкретные буферные классы существуют во многих различных формах для множества различных типов вершин: point-color-normal, point-texcoord-normal, point-normal, point и т. Д.

Мне нужно иметь возможность добавлять вершины любого типа в буфер, содержащий классы, производные от примитивов, например, наборы квадратов, три-списки и т. Д.

class Buffer {
//...
template<class T>
virtual void Add(const T&) = 0; // nope! Not compilable
virtual void Add(boost::any&) = 0; // I have been told no boost allowed either..
}

template<class T>
TypedBuffer : public Buffer {
//..
public:
std::vector<T> buffer;
public:
virtual void Add( const T& elem ) { buffer.push_back( elem ); }
}

class Primitive {
protected:
Buffer vertices;
public:
// How can I allow this to happen? \/
virtual void AddVert( const vec3& v) { vertices.Add( v ); }
}

class QuadSet : public Primitive { /*QuadSet Specifics..*/ }

void main(){
QuadSet q;
q.Add( COLOURED_VERT(vec3(1, 2, 3), vec3(0.5,0.5,0.5) ) );
}

Пожалуйста помоги!

1

Решение

Столкнувшись с подобной проблемой, я использовал тип ластик. Однако в моем примере требуется использовать что-то вроде reinterpret_cast:

class Buffer {
virtual void Add(const void*) = 0;
};

template <typename T>
class TypedBuffer: Buffer {
virtual void Add(const void* e) { buffer.push_back(*static_cast<T*>(e)); }
};

class Primitive {
virtual void AddVert(const vec3& v) { vertices.Add(reinterpret_cast<const void*>(&v)); }
};
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector