2013-08-23 108 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