2013-08-23 115 views
1

我在使用C++一些麻烦:我有一个类原始,它包含一个抽象类缓冲器的成员变量..以许多不同的形式存在于许多不同顶点类型避免虚拟模板

混凝土缓冲区类..点颜色正常,点texcoord正常,点正常,点,等等。

我需要能够添加任何类型的顶点到由基元派生的类所持有的缓冲区,例如四列表,三列表等。

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))); 
} 

请帮忙!

+0

你总是可以重塑Boost.any。这并不难,而且如果你可以靠抄袭别人的想法为生,总是很好的。 –

回答

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)); } 
}; 
+0

看起来不错!谢谢! :) – mynameisnafe