亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> C语言

C++ 类模板实战指南:编写灵活的类型无关代码

C++ 类模板实战指南

本教程通过清晰的真实案例,讲解如何利用 C++ 类模板编写灵活、类型无关的泛型代码。

模板是 C++ 泛型编程基石。它们让你创建可复用组件,适配任意数据类型,提升代码清晰度并减少重复。C++ 提供两种模板:函数模板和类模板。

类模板让你定义单个类适配多种数据类型,不仅缩短代码,还简化维护。


声明类模板

类模板以 template 关键字开始,后跟尖括号包裹的模板参数列表,随后是类定义:

template <class T>
class MyClass {
private:
    T var;
public:
    T getVar() const;
};

T 为占位符,实例化时替换为具体类型。class 可替换为 typename,语义相同。


实例化类模板

模板定义后,指定类型创建对象:

MyClass<int> intObj;
MyClass<float> floatObj;
MyClass<std::string> stringObj;

每次实例化在编译期生成针对指定类型的具体类。


示例 1:通用数值包装器

#include <iostream>
using namespace std;

// 存储任意类型单值的类模板
template <class T>
class Number {
private:
    T value;
public:
    Number(T v) : value(v) {}
    T getValue() const { return value; }
};

int main() {
    Number<int> intNum(7);
    Number<double> doubleNum(7.7);
    cout << "int Number = " << intNum.getValue() << endl;
    cout << "double Number = " << doubleNum.getValue() << endl;
    return 0;
}

输出

int Number = 7
double Number = 7.7

模板参数 T 用于成员变量、构造函数参数和返回类型,使类适配任意类型。


类外定义成员函数

成员函数较大或跨特化共享时,可在类外定义:

template <class T>
class Sample {
public:
    T identity();
};

// 类外定义
template <class T>
T Sample<T>::identity() {
    return static_cast<T>(1);
}

注意类外定义前需重复 template<class T> 声明。


示例 2:基于类模板的计算器

#include <iostream>
using namespace std;

template <class T>
class Calculator {
private:
    T a, b;
public:
    Calculator(T x, T y) : a(x), b(y) {}
    T add() const { return a + b; }
    T subtract() const { return a - b; }
    T multiply() const { return a * b; }
    T divide() const { return a / b; }
    void display() const {
        cout << "a: " << a << ", b: " << b << endl;
        cout << "a + b = " << add() << endl;
        cout << "a - b = " << subtract() << endl;
        cout << "a * b = " << multiply() << endl;
        cout << "a / b = " << divide() << endl;
    }
};

int main() {
    Calculator<int> intCalc(2, 1);
    Calculator<float> floatCalc(2.4f, 1.2f);
    cout << "Int results:\n";
    intCalc.display();
    cout << "\nFloat results:\n";
    floatCalc.display();
    return 0;
}

输出

Int results:
a: 2, b: 1
a + b = 3
a - b = 1
a * b = 2
a / b = 2
Float results:
a: 2.4, b: 1.2
a + b = 3.6
a - b = 1.2
a * b = 2.88
a / b = 2

多参数模板与默认类型

类模板可接受多个参数,并提供默认类型:

template <class T, class U, class V = int>
class MultiParam {
    T first;
    U second;
    V third;
};

示例 3:多参数模板

#include <iostream>
using namespace std;

template <class T, class U, class V = char>
class ClassTemplate {
private:
    T var1;
    U var2;
    V var3;
public:
    ClassTemplate(T v1, U v2, V v3) : var1(v1), var2(v2), var3(v3) {}
    void print() const {
        cout << "var1 = " << var1 << endl;
        cout << "var2 = " << var2 << endl;
        cout << "var3 = " << var3 << endl;
    }
};

int main() {
    ClassTemplate<int, double> obj1(7, 7.7, 'c');
    cout << "obj1 values:\n";
    obj1.print();
    ClassTemplate<double, char, bool> obj2(8.8, 'a', false);
    cout << "\nobj2 values:\n";
    obj2.print();
    return 0;
}

输出

obj1 values:
var1 = 7
var2 = 7.7
var3 = c
obj2 values:
var1 = 8.8
var2 = a
var3 = 0

第三个模板参数默认为 char,obj2 显式指定为 bool 覆盖默认值。

C语言

  1. C# static 关键字:静态变量、方法与类完全掌握
  2. 理解 C# 嵌套类:定义、访问与继承实战
  3. 掌握 C++ 运算符:六大类型全解析与实战示例
  4. C++ 注释最佳实践:编写可读、可维护代码的注释艺术
  5. C++存储类别全解析:auto/register/static/extern/mutable作用域与生命周期
  6. C++多态实战指南:虚函数、动态绑定与纯虚函数
  7. C++数据抽象实战:接口与实现分离的设计艺术
  8. C++数据封装:守护代码安全的核心机制
  9. C++接口编程:抽象类与纯虚函数实现规范契约
  10. C++模板编程指南:泛型编程基石与函数/类模板实战
  11. C# 继承完全指南:基类、派生类、初始化与多重继承替代方案
  12. C# 多态完全指南:静态多态与动态多态(重载、重写、虚方法)