2015-08-14 28 views
1

我正在閱讀庫的源代碼。但我不明白這個模板定義如何工作的:我不明白這個C++模板如何工作

template <class A> 
struct Use{ 
    template <class T> struct AsVertexType: public T{typedef A VertexType; typedef VertexType * VertexPointer ;}; 
    template <class T> struct AsEdgeType: public T{typedef A EdgeType;   typedef EdgeType * EdgePointer   ;}; 
    template <class T> struct AsFaceType: public T{typedef A FaceType;   typedef FaceType * FacePointer   ;}; 
    template <class T> struct AsTetraType: public T{typedef A TetraType;  typedef TetraType * TetraPointer  ;}; 
    template <class T> struct AsHEdgeType: public T{typedef A HEdgeType;  typedef HEdgeType * HEdgePointer  ;}; 
}; 

這是如何使用使用<到declaire類>模板:

struct MyUsedTypes : public vcg::UsedTypes< vcg::Use<MyVertex> :: AsVertexType, 
              vcg::Use<MyEdge> :: AsEdgeType, 
              vcg::Use<MyFace> :: AsFaceType> {}; 

在使用<>模板定義,有兩個未知類型A和T.

vcg::Use<MyVertex>::AsVertexType爲例,我認爲A是MyVertex,但什麼是T?


補充

這裏是模板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 > {}; 

等一系列元數模板定義的定義。這就像一個數學歸納法

template < class Base, 
      template <typename> class A > 
class Arity1: public A<Base> {}; 


template < class Base, 
      template <typename> class A, 
      template <typename> class B > 
class Arity2: public B<Arity1<Base, A>> {}; 


template < class Base, 
      template <typename> class A, template <typename> class B, 
      template <typename> class C > 
class Arity3: public C<Arity2<Base, A, B>> {}; 
    . 
    . 
    . 
template < class Base, 
      template <typename> class A, template <typename> class B, 
      template <typename> class C, template <typename> class D, 
      template <typename> class E, template <typename> class F, 
      template <typename> class G, template <typename> class H, 
      template <typename> class I, template <typename> class J, 
      template <typename> class K, template <typename> class L > 
class Arity12: public L<Arity11<Base, A, B, C, D, E, F, G, H, I, J, K>> {}; 

現在還很難說,模板參數T是什麼。

+0

完整源代碼,請。 – curiousguy

回答

1

vcg::Use<MyVertex> ::AsVertexType是一個模板,並在給vcg::UsedTypes作爲模板參數,構成了模板的模板參數 - 如果你搜索這個詞,你會發現很多的解釋。這是達vcg::UsedTypes模板來決定是否使用AsVertexType模板,以怎樣的T參數(S)。

0

它看起來像vcg::UsedTypes採用模板作爲模板參數。所以T將是無論哪種類型或類型UsedTypes使用模板。

相關問題