C++中的泛型类

Generic Classes in C++

本文关键字:泛型类 C++      更新时间:2023-10-16

>我正在阅读主题 泛型类 .我一度被卡住了.以下是一段代码

template <class StackType> class stack
{
    StackType stck[10];
    int tos;
public:
    stack() {tos=0;}
    void push(StackType ob);
    StackType pop();
};

我的问题是,在template <class StackType> class stack,有两个类(StackTypestack)?

我的意思是编译器如何将其视为使堆栈成为 StackType 或其他东西的嵌套类?

它不是在创建第二个类,而是创建一个类型为Stack的类,其中StackType被用户给定的类型所取代。定义这一点的更好方法是使用typename(§14.1.2),这样可以更清楚地了解实际发生的情况。有关模板的详细信息,请参阅C++模板。

您描述的是模板中的嵌套类:

template <typename Type>
class Stack
{
public:
    class InnerType
    {
    };
};

在此示例中,InnerType 是一个类,其强名称为 Stack<Type>::InnerType ,它是基于提供类型的特定类。因此,如果在代码中的某个地方创建一个对象,如下所示:

auto x = new Stack<int>();

然后将存在一个类型 Stack<int>::InnerType 的类。模板类仅在代码中使用时才存在于程序集中,因此,如果未实现任何Stack变体的对象,则(任何模板类型)的InnerType将不存在。

有关声明模板的更多详细信息也在此处讨论 SO。

没有第二个类。 StackType是模板参数。你可以像考虑一个参数的函数的参数一样考虑它。除非调用并提供其参数,否则该函数无法执行任何操作。与模板类StackType相同,它是模板类型stack的类型参数。当您提供 type[name] 作为模板类的参数时,您将专用化模板类。所有这些参数提供和专用化都发生在编译时。例如,当编译器第一次遇到类似的东西时

stack stackVariable;

typedef stack StackOfInts;

只有这样,它才能真正编译并初始化一个名为 stack< int > 的类型 - 整数堆栈。在那一刻之前,没有任何东西堆积起来。

使用 int 实例化后,您的类将变为:

template<>
class stack< int >
{
  int stck[10];
  int tos;
public:
  stack() {tos=0;}
  void push(int ob);
  int pop();
};

<>内部的class与外部的含义不同。它本质上与typename相同.

所以模板不是类。它是模板从用户定义类型(例如 int)创建类的一种方式。所以当我说:

stack<int>

编译器从您的类生成一个类stack < int >,实质上是用int填充StackType并编译该类。

因此,如果我做一个:

stack<stack<int> >

编译器将生成两个类stact < int > stack < stack < int > >

模板创建一系列类 - 每个类具有相同的功能,但对不同类型的操作。

在您的示例中,它正在创建一个类族,例如 X 类的堆栈、Y 类的堆栈等。