避免虚拟模板

时间:2013-08-23 11:40:18

标签: c++ templates abstraction

我在使用C ++时遇到了一些问题:我有一个类Primitive,它包含一个抽象缓冲类的成员变量..

对于许多不同的顶点类型,具体缓冲类以许多不同的形式存在。点颜色正常,点 - 特殊 - 正常,点 - 正常,点等。

我需要能够将任何类型的顶点添加到由基元派生的类所拥有的缓冲区中,例如quadsets,tri-lists等。

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 个答案:

答案 0 :(得分:0)

当遇到类似问题时,我最终使用了橡皮擦。但是在我的例子中,它需要使用像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)); }
};