📜  C++ |模板|问题1(1)

📅  最后修改于: 2023-12-03 14:39:54.126000             🧑  作者: Mango

C++ |模板|问题1

在C++中,模板是一种代码重用机制,允许用户编写具有通用性的代码。模板使得程序员可以编写一次代码来工作于多种不同的数据类型,而不必编写类似的代码多次。

定义模板

模板的定义以关键字template开始,后跟模板参数列表和模板体。模板参数列表是一组以逗号分隔的模板参数,用于指定模板化的类型或值。模板体包含一个或多个使用形参类型与模板参数定义的函数或类。

函数模板

下面是一个使用函数模板解决两个数相加的例子:

template<typename T>
T add(T a, T b)
{
    return a + b;
}

在上面的例子中,定义了一个名为add的函数模板,其中使用了一个名为T的类型参数。该函数的参数和返回值类型都为T类型,这意味着函数可以对任意类型进行通用性操作。例如:

int main()
{
    int a = 1, b = 2;
    double c = 1.5, d = 3.7;
    
    cout << add(a, b) << endl;   // 输出 3
    cout << add(c, d) << endl;   // 输出 5.2
    return 0;
}

在上面的示例中,我们传递了不同的参数类型,但是函数模板仍然工作正常。

类模板

下面是一个使用类模板创建动态数组的例子:

template<typename T>
class DynamicArray
{
private:
    T* data;
    int size;
public:
    DynamicArray(int s);
    ~DynamicArray();
    void set(int index, T value);
    T get(int index);
};

template<typename T>
DynamicArray<T>::DynamicArray(int s)
{
    size = s;
    data = new T[size];
}

template<typename T>
DynamicArray<T>::~DynamicArray()
{
    delete[] data;
}

template<typename T>
void DynamicArray<T>::set(int index, T value)
{
    data[index] = value;
}

template<typename T>
T DynamicArray<T>::get(int index)
{
    return data[index];
}

在上面的代码中,我们定义了一个名为DynamicArray的类模板。该模板使用了一个名为T的类型参数,它表示数据的类型。我们在DynamicArray类中定义了一些函数来设置和获取数据,以及在构造函数中分配内存。

下面是我们如何使用DynamicArray模板创建两个不同的数组:

int main()
{
    DynamicArray<int> arr1(10);
    DynamicArray<double> arr2(5);
    
    for (int i = 0; i < 10; i++)
    {
        arr1.set(i, i);
    }
    
    for (int i = 0; i < 5; i++)
    {
        arr2.set(i, i + 0.5);
    }
    
    for (int i = 0; i < 10; i++)
    {
        cout << arr1.get(i) << " ";
    }
    cout << endl;
    
    for (int i = 0; i < 5; i++)
    {
        cout << arr2.get(i) << " ";
    }
    cout << endl;
    return 0;
}

在上面的示例中,我们创建了两个不同的DynamicArray对象,一个用于整数,另一个用于双精度浮点数。对于每个数组,我们循环设置值,最后循环打印出它们的值。

模板特化

模板特化是指将通用的模板代码针对特定的类型进行优化。在下面的示例中,我们将上面的DynamicArray模板特化为char类型:

template<>
class DynamicArray<char>
{
private:
    char* data;
    int size;
public:
    DynamicArray(int s);
    ~DynamicArray();
    void set(int index, char value);
    char get(int index);
};

DynamicArray<char>::DynamicArray(int s)
{
    size = s;
    data = new char[size];
}

DynamicArray<char>::~DynamicArray()
{
    delete[] data;
}

void DynamicArray<char>::set(int index, char value)
{
    data[index] = value;
}

char DynamicArray<char>::get(int index)
{
    return data[index];
}

在上面的代码中,我们创建了一个特化版本的DynamicArray模板,并将它所有使用的T类型特化为char类型。在这个特化版本中,我们分配的内存及数据类型都为char类型。

结论

模板是C++中非常重要的机制,使得我们可以将代码通用化,减少代码冗余。在实际编程中,我们可以使用类、函数及类成员函数模板来创建通用性代码,并通过模板特化实现针对特定类型的代码优化。