在课堂中使用模板中的混乱

Confusion in using templates in class

本文关键字:混乱 课堂      更新时间:2023-10-16

我当前正在教我/学习通用编程以及如何使用templates在运行时声明数据类型。我理解了一个基本示例,您可以在其中制作变量一个模板,以便您以后可以进行任何数据类型,但是这里是我尝试使用类/vector的模板:

#include <string>
#include <vector>
#include <iostream>
using namespace std;
template <class T, class U>   
class CMap{ 
private:
    vector<T> keys;
    vector<U> values;
public:
    void insert(T key, U value){
        keys.push_back(key);
        values.push_back(value);
    }
    void get(int n){
        cout << keys[n] << " values ->" << values[n];
    }
};
int main(){
    CMap<string, int> grades;
    grades.insert("Jones", 12);
    grades.insert("Smith", 40);
    grades.get(0);
    cout << endl;
    grades.get(1);
    cout << endl;
}

我知道我们创建了TU作为模板,该模板将进入vector数据类型。我也知道我们可以动态使用insert方法,因为TU是模板。

我不明白:

当我声明我的课时,我被告知添加以下<string, int>我不明白这在做什么?它如何知道第一个参数应该转到vector<t> keys,而<>内的第二个参数应转到vector<u> values-如果是它在做什么?

使用语句CMap<string, int> grades;时,您正在创建类型CMAP的对象,其中每次出现T的每次出现都被string替换,并且每次出现U的出现都被int替换。

由于您的插入方法具有签名void insert(T key, U value),因此您新创建的对象将采用stringint替换TU,因为这是您创建对象时提供的数据类型。

您可以将您喜欢的任何数据类型用于TU,包括您自己的类。

让我们首先清除在C 中声明模板的含义,因为似乎有些混乱。

什么模板

模板是您创建类的东西,就像一类工厂一样。模板是不是类别或类型。

您声明了一个模板及其将通过template<class T, class U /* ... */>采取的参数,类似于函数将值作为参数的方式。

当您将类型作为模板参数传递时,您实例化模板,从而创建类型。当实例化模板时,您输入的类型将替换相同参数的出现,同样,类似于参数传递与函数的方式相似。

template<class T>
class MyTemplateClass
{
public:
    T member;
};
MyTemplateClass<int> var;

在此示例中,MyTemplateClass是模板,它是不是类型。

MyTemplateClass<int> 一种类型,恰好具有int类型的成员变量。我们说MyTemplateClass<int>MyTemplateClass实例化MyTemplateClassT的每一次出现都被MyTemplateClass<int>中的int替换。

由于MyTemplateClass<int>只是一种类型,最后一行只是一个变量声明,因此var只是类型MyTemplateClass<int>的变量。

这一切都发生在compile time,不是运行时。
编译器确切地知道MyTemplateClass<int>是什么,并且确切知道其中的类型,并且确切知道代码应编译为什么。

回答您的问题

在您的情况下

template<class T, class U>
class CMap{ 
private:
    vector<T> keys;
    vector<U> values;
//...
};

确实声明您的模板具有2个参数,并且具有2个成员变量。keys具有类型vector<T>,其中T是第一个模板参数,而values具有vector<U>类型U是第二个模板参数。

CMap<string, int> grades;

确实在宣布使用类型CMap<string, int>的变量grades

CMap<string, int>是用stringint作为参数的CMap的实例化。

grades.keys具有类型vector<string>grades.values类型vector<int>