【发布时间】:2011-06-09 21:44:39
【问题描述】:
我正在为一个网格类编写一个包装器,试图实现一个更直观的界面。网格使用有些笨拙的迭代器,可以递增和比较但不能取消引用;相反,您必须从网格中获取它们关联的特征句柄。同样,特征句柄是愚蠢的,因此要从顶点获取位置/颜色/任何内容,您必须在网格上调用另一个函数:
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采用模板参数? -
我有几个不同的网格类具有相同的 API(例如运行时/离线版本)。模板与我遇到的问题无关,对吧?
-
你的情况下的迭代器是什么?它支持哪些功能?它只是取消引用(产生
SmartVertexHandle)并增加吗? -
是的,据我所知,这无关紧要。
-
愚蠢的迭代器(
Mesh::VertexIterator等)只做前缀++和--。智能迭代器(SmartVertexIterator等)还应该执行后缀递增/递减(不是问题)并取消对SmartVertexHandle的引用。
标签: c++ templates operator-overloading