c++模板内部模板调用

c++ templates inside template call

本文关键字:调用 内部 c++      更新时间:2023-10-16

关于c++模板机制的一个小问题。假设我们有一个名为Point的类。现在假设"Data"是一个模板类/容器,只包含T(模板)数据成员。也就是说,"Data"或多或少是这样的:

Template <class T>
class Data {
T dMember;
……..
};

现在假设有人在main.cpp文件中使用了这个类,并预先做了以下声明:

Data<Data<Point>> d;

我试图完全理解创建的对象是什么样子的。我试图使用编译器进入类调用,但无济于事。我知道Data需要初始化Data所以它调用自己一次,但它真正做什么呢?是否有一个构造函数被激活?

谢谢你,家伙

它就像在下面的例子中实例化Data2:

class Data1 {
    Point dMember;
};
class Data2 {
    Data1 dMember;
};
Data2 d; // = Data<Data<Point>> d;

基本上是Point的换行

我知道Data需要初始化Data,所以它调用自己一次,但它真正做什么呢?是否有一个构造函数被激活?

数据并不真正调用自己一次。这是因为内部数据和外部数据是两个不同的类。一般情况下,如果编译器看到Data<Data<Point>>,它首先识别内部部分,即Data<Point>。然后,它将实例化模板,这意味着它创建了一个具有模板描述的属性的类。重要的是要认识到Data不是一个类,而是一个可用于创建一大堆类的模板。每一个类都是不同的,它们是不同的类型,彼此之间没有真正的联系。所以Data<Point>只是模板的一个实例化,它是一个具有相同属性的类,比如

class Foo {
  Point dMember;
  ...
};

我就叫它Foo。然后编译器看到Data<Data<Point>>,也可以是Data<Foo>。它再次实例化模板,这次使用Foo(即从第一次实例化中获得的类)作为参数。它获得另一个类,原则上完全独立于第一个类,除了它具有第一个实例化类型的成员:

class Bar {
  Foo dMember;
  ...
};

这一切。Data不调用自己,Data甚至不作为类型存在。在初始化中调用的构造函数是Bar的构造函数,而Bar的构造函数又会调用Foo的构造函数。在Data中定义的构造函数不是真正的构造函数,因为类模板中的任何东西本身都是模板。它是一个构造函数模板,如果你调用Foo和/或Bar的构造函数,编译器会使用那个模板来实例化实际的构造函数。

Data只是编译器构建真正的类(如果需要的话,还有成员函数)的蓝图,它永远不会在那里播放或调用或初始化任何东西。

Point>应该是:

class Data<Point> {
  Point dMember;
  ...
};

Data>应该是:

class Data<Data<Point>> {
  Data<Point> dMember;
  ...
};

第二个,Data用作任何其他成员变量。

如果Data有一个构造函数,它将被调用两次。首先是Data,因为它是一个成员变量,并且首先调用它们的构造函数。然后是Data<点>>。