我正在为一个网格类编写包装器,试图实现更直观的接口。该网格使用相对简单的迭代器,可以进行增量和比较,但不能取消引用;相反,您必须从网格中获取它们关联的特征句柄。同样,特征句柄也是相对简单的,因此要从顶点获取位置/颜色/任何其他信息,您必须在网格上调用另一个函数:
Mesh mesh;
VertexIterator vertices = mesh.VerticesBegin();
VertexHandle vertex = mesh.VertexIteratorToHandle(vertices);
Vector3 vertexPosition = mesh.GetVertexPosition(vertex);
我希望能够做到以下操作:
取而代之,我想这样做:
MeshWrapper<Mesh> wrapper(mesh);
Vector3 vertexPosition = wrapper.VerticesBegin()->Position();
为了使这种更方便的风格成为可能,我为网格、它的迭代器和句柄提供了包装类:
template <class Mesh>
class SmartVertexHandle
{
public:
SmartVertexHandle(Mesh::VertexHandle dumbVertexHandle, Mesh* parent);
Vector3 Position();
Vector3 Color();
// etc ...
private:
Mesh* m_parent;
typename Mesh::VertexHandle m_dumbVertexHandle;
}
template <class Mesh>
class SmartVertexIterator
{
public:
SmartVertexHandle<Mesh>* operator->();
// etc ...
private:
Mesh* m_parent;
typename Mesh::VertexIterator m_dumbVertexIterator;
}
实现 -> 运算符是我困扰的问题。我需要返回一个指向 SmartVertexHandle 的指针,但是从网格中获取的却是一个愚蠢的 Mesh::VertexHandle。我目前解决这个问题的方法如下:
template <class Mesh>
class SmartVertexIterator
{
public:
SmartVertexHandle<Mesh>* operator->()
{
m_vertexWrapper = SmartVertexHandle<Mesh>(m_parent->VertexIteratorToHandle(m_dumbVertexIterator), m_parent);
return &m_vertexWrapper;
}
private:
Mesh* m_parent;
typename Mesh::VertexIterator m_dumbVertexIterator;
SmartVertexHandle<Mesh> m_vertexWrapper;
}
这让我感到非常糟糕,充满危险,更不用说浪费空间了。有没有什么方法可以避免这种情况呢?抱歉问题有点长,谢谢 :)
Mesh
),那么为什么MeshWrapper
需要带一个模板参数? - MaxpmMesh :: VertexIterator
等)只执行前缀++
和--
。智能迭代器(如SmartVertexIterator
等)还应该执行后缀递增/递减(不是问题)并反引用到SmartVertexHandle
。 - Hexanol