vcg数据结构2
vcg数据结构2
主要是used_types.h文件中定义的一些类
UsedTypes类
定义如下
template <template <typename> class A = DefaultDeriver, template <typename> class B = DefaultDeriver,template <typename> class C = DefaultDeriver, template <typename> class D = DefaultDeriver,template <typename> class E = DefaultDeriver, template <typename> class F = DefaultDeriver,template <typename> class G = DefaultDeriver, template <typename> class H = DefaultDeriver >
class UsedTypes: public Arity12>> :: template AsVertexType,
Use>>::template AsEdgeType,
Use>>::template AsFaceType,
Use>>:: template AsHEdgeType,
A, B, C, D, E, F, G, H>
{};
UsedTypes继承于Arity12,而Arity12类之前有分析过,就是一连串的继承链表,现在设
T1=UseC,D,E,F,G,H>>>::template AsVertexType
T2=UseC,D,E,F,G,H>>>::template AsEdgeType
T3=UseC,D,E,F,G,H>>>::template AsFaceType
T4=UseC,D,E,F,G,H>>>:: template AsHEdgeType
那么UsedTypes类的继承关系大致如下:
UsedTypes:Arity12:H:Arity11:G:Arity10:F:Arity9:E:Arity8:D:Arity7:C:Arity6:B:Arity5:A:Arity4
而Arity4的模板参数为:
Arity4
那么可以推测,类T1 T2 T3 T4都是模板类且继承于模板参数类,事实也是如此,以T1为例:
UseC,D,E,F,G,H>>>::template AsVertexType
设VertexC,D,E,F,G,H>>为X1,T1为
Use::template AsVertexType
AsVertexType的定义如下:
template <class T> struct AsVertexType: public T{typedef A VertexType; typedef VertexType * VertexPointer ;};
对于Use,此处的A=X1
也就是说T1确实是一个模板类,且继承于模板类参数,那么继承链表在Arity4就可以继续向下去了,所以整个继承链表如下:
UsedTypes:Arity12:H:Arity11:G:Arity10:F:Arity9:E:Arity8:D:Arity7:C:Arity6:B:Arity5:A:Arity4:T4:Arity3:T3:Arity2:T2:Arity1:T1:DummyTypes
DummyTypes类定义如下:
struct DummyTypes{typedef _Vertex VertexType; // simplex typestypedef _Edge EdgeType;typedef _Face FaceType;typedef char TetraType;typedef _HEdge HEdgeType; // connector typestypedef vcg::Point3<bool> CoordType;typedef char ScalarType;typedef VertexType * VertexPointer;typedef EdgeType * EdgePointer ;typedef FaceType * FacePointer ;typedef TetraType * TetraPointer ;typedef HEdgeType * HEdgePointer ;static void Name(std::vector<std::string> & /*name*/){}template < class LeftV>void ImportData(const LeftV & /*left*/ ) {}
};
主要是一些类型的定义(typedef),可以推测,整个继承链的作用之一就是覆盖这个类的一些类型定义。
那么第一个其覆盖作用的就是T1,T2,T3,T4这4个类,此处以T4为例做分析:
T4=Use>>:: template AsHEdgeType
template <class T> struct AsHEdgeType: public T{typedef A HEdgeType; typedef HEdgeType * HEdgePointer ;};
可以看到该类覆盖了基类的两个定义:
typedef A HEdgeType;
typedef HEdgeType * HEdgePointer
T1 T2 T3类似,那么到这一步,可以看到我们分析的这个UsedTypes类主要就是定义了几种类型,当然目前只是默认情况,事实上根据用户选择使用的模板参数,会再次覆盖基类的定义。
顶点类型的定义
现在接着上面的分析,来看一下顶点到底是什么。
此时要回到最开始,vcg定义了_UsedTypes
struct _UsedTypes: public UsedTypes
_UsedTypes给模板参数A B C D赋了值,而A B C D将会导致VertexType等类型被覆盖,也就是说最终_UsedTypes中的类型定义如下,以顶点类型为例
typedef A VertexType; typedef VertexType * VertexPointer ;
此处的A为_Vertex
那么再来看_Vertex: public Vertex<_UsedTypes>{};定义如下
template <class UserTypes,
template<typename>class A=DefaultDeriver, template <typename> class B = DefaultDeriver,
template<typename>class C=DefaultDeriver, template <typename> class D = DefaultDeriver,
template<typename>class E=DefaultDeriver, template <typename> class F = DefaultDeriver,
template<typename>class G=DefaultDeriver, template <typename> class H = DefaultDeriver,
template<typename>class I=DefaultDeriver, template <typename> class J = DefaultDeriver,
template <typename> class K = DefaultDeriver>
class Vertex: public VertexArityMax {
public: typedef AllTypes::AVertexType IAm; typedef UserTypes TypesPool;
}// end namespace
类本身只有两个定义:
typedef AllTypes::AVertexType IAm;
typedef UserTypes TypesPool;
其中UserTypes 为_UsedTypes。
继续分析AVertexType ,会发现VertexArityMax:public Arity12
HEdgeArityMax本身也是有内容的,主要是一些标记位的方法与定义,这里就不展开了。
最终,会继承于vertex::EmptyCore
template <class TT>
template <class TT> class EmptyCore: public TT
此时模板参数TT=UsedTypes
可以看到EmptyCore类定义了许多方法,但都是一些简单的实现。
那么现在来看一下TT=_UsedTypes
此时就要回到最开始的定义了,_UsedTypes: public UsedTypes
这样,每种类型本身优会包含其它类型的定义了。
总的来说,vcg的_UsedTypes与_Vertex等只是继承了基本类型,并没有什么实质性的实现。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
