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<DummyTypes,
Use<Vertex<UsedTypes<A,B,C,D,E,F,G,H>>> :: template AsVertexType,
Use<Edge<UsedTypes<A,B,C,D,E,F,G,H>>>::template AsEdgeType,
Use<Face<UsedTypes<A,B,C,D,E,F,G,H>>>::template AsFaceType,
Use<HEdge<UsedTypes<A,B,C,D,E,F,G,H>>>:: template AsHEdgeType,
A, B, C, D, E, F, G, H>  
{};

UsedTypes继承于Arity12,而Arity12类之前有分析过,就是一连串的继承链表,现在设

T1=Use<Vertex<UsedTypes<A,B,C,D,E,F,G,H>>>::template AsVertexType
T2=Use<Edge<UsedTypes<A,B,C,D,E,F,G,H>>>::template AsEdgeType
T3=Use<Face<UsedTypes<A,B,C,D,E,F,G,H>>>::template AsFaceType
T4=Use<HEdge<UsedTypes<A,B,C,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<DummyTypes,T1,T2,T3,T4>

那么可以推测,类T1 T2 T3 T4都是模板类且继承于模板参数类,事实也是如此,以T1为例:

Use<Vertex<UsedTypes<A,B,C,D,E,F,G,H>>>::template AsVertexType
设Vertex<UsedTypes<A,B,C,D,E,F,G,H>>为X1,T1为
Use<X1>::template AsVertexType

AsVertexType的定义如下:

template <class T> struct AsVertexType: public T{typedef A VertexType;  typedef VertexType * VertexPointer  ;};
对于Use<X1>,此处的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 types
        typedef _Edge EdgeType;
        typedef _Face FaceType;
        typedef char TetraType;
        typedef _HEdge HEdgeType;       // connector types

        typedef 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<HEdge<UsedTypes<A,B,C,D,E,F,G,H>>>:: 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<
    Use<_Vertex>::AsVertexType,
    Use<_Edge  >::AsEdgeType,
    Use<_Face  >::AsFaceType,
    Use<_HEdge >::AsHEdgeType
>{};
struct _Vertex: public  Vertex<_UsedTypes>{};
struct _Edge  : public  Edge<_UsedTypes>{};
struct _Face  : public  Face<_UsedTypes>{};
struct _HEdge : public  HEdge<_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<UserTypes, A, B, C, D, E, F, G, H, I, J, K>  {
public: typedef AllTypes::AVertexType IAm; typedef UserTypes TypesPool;
}// end namespace

类本身只有两个定义:

typedef AllTypes::AVertexType IAm;
typedef UserTypes TypesPool;
其中UserTypes 为_UsedTypes。

继续分析AVertexType ,会发现VertexArityMax:public Arity12<vertex::EmptyCore<UserTypes>, A, B, C, D, E, F, G, H, I, J, K, L>
HEdgeArityMax本身也是有内容的,主要是一些标记位的方法与定义,这里就不展开了。
最终,会继承于vertex::EmptyCore<UserTypes>

template <class TT>
template <class TT> class EmptyCore: public TT 
此时模板参数TT=UsedTypes<A,B,C,D,E,F,G,H>
可以看到EmptyCore类定义了许多方法,但都是一些简单的实现。

那么现在来看一下TT=_UsedTypes
此时就要回到最开始的定义了,_UsedTypes: public UsedTypes
这样,每种类型本身优会包含其它类型的定义了。

总的来说,vcg的_UsedTypes与_Vertex等只是继承了基本类型,并没有什么实质性的实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值