[英]I can't understand how this C++ template work
我正在阅读库的源代码。 但是我不明白这个模板定义是如何工作的:
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 ;};
};
这是使用Use <>模板对一个类进行分类的方法:
struct MyUsedTypes : public vcg::UsedTypes< vcg::Use<MyVertex> :: AsVertexType,
vcg::Use<MyEdge> :: AsEdgeType,
vcg::Use<MyFace> :: AsFaceType> {};
在Use <>模板定义中,有两个未知的类型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 > {};
以及一系列Arity模板定义。 就像数学归纳法
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是什么。
vcg::Use<MyVertex> ::AsVertexType
是模板,当将vcg::UsedTypes
用作模板参数时,就构成了模板模板参数 -如果您搜索该术语,则会发现很多说明。 由vcg::UsedTypes
模板决定是否使用AsVertexType
模板以及使用什么T
参数。
看起来vcg::UsedTypes
将模板作为模板参数。 因此, T
将是使用模板的一种或多种UsedTypes
类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.