c++ - 我不明白这个 C++ 模板是如何工作的

标签 c++ templates template-templates

我正在阅读图书馆的源代码。但是我不明白这个模板定义是如何工作的:

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参数。

关于c++ - 我不明白这个 C++ 模板是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32001100/

相关文章:

C++:模板:部分特化:打印所有模板

c++ - 使用模板模板参数合并可变参数模板中的类型

c++ - 在 C++ 中更改模板模板参数

c++ - 为什么我们应该尽量减少循环中 break 和 continue 的使用?

c# - C++ MFC 与 .NET?

c++ - 如何更改代码以使其适用于分布式计算

html - PhpStorm - HTML 5 样板代码片段

c++ - std::map<UnicodeString, UnicodeString> 的 ofstream 输出产生地址而不是字符串

c++ - 关于类模板部分特化和类成员特化的一些混淆

c++ - MSVC 中的模板模板参数错误,但不是 Clang。为什么?