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

📅  最后修改于: 2023-12-03 15:29:42.514000             🧑  作者: Mango

C++ | 模板 | 问题10

在 C++ 中,模板可以被用来创建泛型数据类型和函数。在实际开发中,使用模板可以大大提高代码的重用性和灵活性。

在此问题中,我们将讨论 C++ 中的函数模板和类模板。

函数模板

函数模板是一种通用函数的定义,其参数类型不是特定的数据类型。通过函数模板,我们可以定义一种可以处理任意数据类型的通用函数,并且可以在实际调用时传递具体的数据类型。

函数模板的语法如下:

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

在上面的代码中,add 是一个接受两个参数并返回它们的和的通用函数模板。使用 typename 关键字表示模板参数类型。

下面是使用函数模板的示例:

int main() {
    int a = 5, b = 10;
    double c = 1.5, d = 2.5;

    std::cout << add<int>(a, b) << std::endl;    // 输出 15
    std::cout << add<double>(c, d) << std::endl; // 输出 4
    return 0;
}

在上面的示例中,我们可以看到 add 函数模板被调用两次,分别传递整型和双精度浮点数类型参数。

类模板

类模板是一种通用类的定义,其数据成员和成员函数的数据类型不是特定的数据类型。通过类模板,我们可以定义一种可以处理任意数据类型的通用类,并且可以在构造对象时传递具体的数据类型。

类模板的语法如下:

template<typename T>
class Vector {
public:
    Vector() : size(0), capacity(INITIAL_CAPACITY), data(new T[INITIAL_CAPACITY]) {}

    void push_back(T element) {
        if (size == capacity) {
            resize();
        }
        data[size++] = element;
    }

    T& operator[](int index) {
        return data[index];
    }

    int size() const {
        return size;
    }

    ~Vector() {
        delete[] data;
    }

private:
    int size;
    int capacity;
    T* data;

    static const int INITIAL_CAPACITY = 2;

    void resize() {
        T* newData = new T[capacity * 2];

        for (int i = 0; i < size; i++) {
            newData[i] = data[i];
        }

        delete[] data;
        data = newData;
        capacity *= 2;
    }
};

在上面的代码中,Vector 是一个将数据存储在动态数组中的通用类模板。使用 typename 关键字表示模板参数类型。

下面是使用类模板的示例:

int main() {
    Vector<int> myIntVector;
    myIntVector.push_back(1);
    myIntVector.push_back(2);
    myIntVector.push_back(3);

    for (int i = 0; i < myIntVector.size(); i++) {
        std::cout << myIntVector[i] << std::endl;
    }

    Vector<double> myDoubleVector;
    myDoubleVector.push_back(1.5);
    myDoubleVector.push_back(2.5);
    myDoubleVector.push_back(3.5);

    for (int i = 0; i < myDoubleVector.size(); i++) {
        std::cout << myDoubleVector[i] << std::endl;
    }
    return 0;
}

在上面的示例中,我们可以看到 Vector 类模板被实例化两次,分别传递整型和双精度浮点数类型参数。

通过函数模板和类模板,我们可以创建通用代码并处理任意数据类型。它们是 C++ 中重要的工具,可以提高代码的重用性和灵活性。