C++中的泛型类
Generic Classes in C++
>我正在阅读主题 泛型类 .我一度被卡住了.以下是一段代码
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
,有两个类(StackType
和stack
)?
我的意思是编译器如何将其视为使堆栈成为 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 类的堆栈等。
- C++泛型类错误,问题出在哪里?
- C++泛型类,单独实现?
- 如何在 C++ 中声明泛型类
- 在C++中分配泛型类
- 基于变量输入的泛型类方法计算
- C++处理取消引用语法的泛型类
- 用于重载的泛型类成员函数
- 将类型作为指向另一个类的对象的指针的泛型类-NOT WORKING
- 在泛型类中使用带有 CUDA 关键字的模板类
- 在类中使用泛型类成员
- 如何在main中重载运算符>泛型类.cpp
- C++泛型类中的字段/属性
- 用返回子类的方法设计C++泛型类
- C++ 堆栈泛型类,int 变量将 32765 作为值而不是 1
- 将资源移出泛型类
- C++中的泛型类
- 可以在泛型类中为一种类型提供一个可用的函数
- 如何在C++中从泛型类创建对象
- 用泛型类指针作为参数声明函数指针的正确语法是什么
- 使用具有结构成员的泛型类时发生c++编译器错误