C++种模板与用法

在 C++ 中,模板是一种强大的泛型编程工具,用于编写可以适用于多种数据类型的代码。C++ 提供了以下几种主要的模板类型:


1. 函数模板(Function Templates)

函数模板允许编写通用的函数,可以适用于多种数据类型。

示例

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

int main() {
    int x = add(1, 2);         // 使用 int 类型
    double y = add(1.5, 2.5);  // 使用 double 类型
    return 0;
}

2. 类模板(Class Templates)

类模板允许定义通用的类,可以适用于多种数据类型。

示例

template <typename T>
class MyClass {
public:
    MyClass(T value) : data(value) {}
    T getData() { return data; }

private:
    T data;
};

int main() {
    MyClass<int> obj1(10);       // 使用 int 类型
    MyClass<double> obj2(3.14);  // 使用 double 类型
    return 0;
}

3. 模板模板参数(Template Template Parameters)

模板模板参数允许模板类作为另一个模板的参数。

示例

template <typename T>
class Container {
    T value;
};

template <template <typename> class TContainer>
class Manager {
    TContainer<int> container;
};

int main() {
    Manager<Container> manager; // 使用模板模板参数
    return 0;
}

4. 别名模板(Alias Templates)

别名模板是 C++11 引入的,用于为模板定义别名。

示例

template <typename T>
using Vec = std::vector<T>;

int main() {
    Vec<int> v; // 等价于 std::vector
    return 0;
}

5. 变量模板(Variable Templates)

变量模板是 C++14 引入的,用于定义模板变量。

示例

template <typename T>
constexpr T pi = T(3.1415926535897932385);

int main() {
    double pi_double = pi<double>; // 使用 double 类型
    float pi_float = pi<float>;   // 使用 float 类型
    return 0;
}

6. 非类型模板参数(Non-Type Template Parameters)

模板参数不仅可以是类型,还可以是常量值(如整数、指针等)。

示例

template <int N>
class Array {
    int data[N];
};

int main() {
    Array<10> arr; // 创建大小为 10 的数组
    return 0;
}

7. 折叠表达式(Fold Expressions,C++17)

虽然不是模板本身,但与模板变参结合使用时非常强大,用于简化变参模板的操作。

示例

template <typename... Args>
auto sum(Args... args) {
    return (args + ...); // 使用折叠表达式
}

int main() {
    int result = sum(1, 2, 3, 4); // 结果为 10
    return 0;
}

8. 概念(Concepts,C++20)

概念是 C++20 引入的,用于对模板参数进行约束。

示例

template <typename T>
concept Addable = requires(T a, T b) {
    a + b; // 要求 T 类型支持加法操作
};

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

int main() {
    int result = add(1, 2); // 合法
    // std::string result2 = add("a", "b"); // 非法,字符串不满足 Addable
    return 0;
}

总结

C++ 中的模板主要有以下几种类型:

  1. 函数模板
  2. 类模板
  3. 模板模板参数
  4. 别名模板
  5. 变量模板
  6. 非类型模板参数
  7. 折叠表达式(与变参模板结合)
  8. 概念(C++20 引入)






在C++中,模板(Template)是一种泛型编程技术,允许编写与类型无关的代码。模板主要分为函数模板类模板两种。

1. 函数模板

函数模板用于定义可以接受任意类型参数的函数。例如:

#include 
using namespace std;

// 定义一个函数模板
template <typename T>
T add(T a, T b) {
    return a + b;
}

int main() {
    cout << add<int>(3, 5) << endl;    // 输出 8
    cout << add<double>(2.5, 3.7) << endl; // 输出 6.2
    return 0;
}
关键点:
  • template :声明一个模板,T是占位符,表示任意类型。
  • 模板实例化:在调用时可以显式指定类型(如add),也可以让编译器自动推导类型。

2. 类模板

类模板用于定义可以操作任意类型的类。例如:

#include 
using namespace std;

// 定义一个类模板
template <typename T>
class Box {
private:
    T value;
public:
    Box(T v) : value(v) {}
    T getValue() const { return value; }
};

int main() {
    Box<int> intBox(10);       // 实例化为 int 类型
    Box<string> strBox("Hello"); // 实例化为 string 类型

    cout << intBox.getValue() << endl;  // 输出 10
    cout << strBox.getValue() << endl;  // 输出 Hello
    return 0;
}
关键点:
  • template :声明一个类模板,T是占位符。
  • 类模板实例化:在使用时需要指定具体类型(如Box)。

3. 模板的特化

模板特化允许为特定类型提供特殊实现。例如:

#include 
using namespace std;

// 通用模板
template <typename T>
class Printer {
public:
    void print(T value) {
        cout << "Value: " << value << endl;
    }
};

// 特化模板(针对 string 类型)
template <>
class Printer<string> {
public:
    void print(string value) {
        cout << "String Value: " << value << endl;
    }
};

int main() {
    Printer<int> intPrinter;
    intPrinter.print(42); // 输出 Value: 42

    Printer<string> strPrinter;
    strPrinter.print("Hello"); // 输出 String Value: Hello

    return 0;
}

4. 模板的使用场景

  • 容器类:如std::vectorstd::map等。
  • 算法库:如std::sortstd::find等。
  • 通用工具类:如智能指针std::shared_ptrstd::unique_ptr

模板是C++中实现代码复用和泛型编程的核心工具,能够显著提高代码的灵活性和可维护性。

你可能感兴趣的:(c++,c++,java,开发语言)