模板与开关

bbt*_*trb 4 c++

我试图在C++领域找到自己的方式,现在越来越困惑.玩具应用程序是一个非常基本的OpenGL引擎.所以这是(我想简单)问题:我想处理不同顶点数据的网格,所以我有例如

struct Vertex
{
    Vector3f position;
}

struct VertexN : public Vertex
{
    Vector3f normal;
}
Run Code Online (Sandbox Code Playgroud)

现在我需要一个Mesh类,它保存数据并绘制它.我尝试过这样的事情:

template<class T>
class Mesh
{
    public:
        Mesh();
        ~Mesh();

        void load(const T * vertices, int num);
        void draw();

    protected:
        T * vertices_;
Run Code Online (Sandbox Code Playgroud)

};

必须以不同方式加载和绘制不同的顶点,这可以通过模板特化来完成.

我的问题是我喜欢有另一个包含Mesh对象实例的类,但显然不允许使用模板化的类成员.

我能想到的另一个解决方案是在Mesh中保存指向基础结构Vertex的指针,为所使用的Vertex类型传递一个标识符,然后在load()和draw()中使用switch语句以允许不同的实现.

完成此任务的最佳方法是什么?

任何帮助是极大的赞赏.

Jam*_*lis 7

您可以使用继承和虚函数.例如:

class MeshBase
{
public:
    virtual ~MeshBase() { }
    virtual void draw() = 0;
};

template <typename T>
class Mesh : public MeshBase
{
public:
    virtual void draw() { }
    // ...
};
Run Code Online (Sandbox Code Playgroud)

使用此方法,您可以将指针存储MeshBase在容器中的基类中.

理想情况下,您可以使用指针容器,它将为您管理指针,或者您可以使用智能指针的容器(例如,a std::vector<std::shared_ptr<MeshBase> >,如果您的实现包括shared_ptr;如果没有,它可以在许多地方找到) .

我还建议将顶点存储在Mesh类中的容器中,而不是使用手动动态分配和内存管理.

  • 如果你有权访问boost(它是Boost.PointerContainer的一部分),试着选择`boost :: ptr_vector`到`std :: vector <boost :: shared_ptr>`.在C++ 0x中,您可以使用`std :: vector <unique_ptr>`来避免boost依赖. (2认同)