当前位置: 首页 > news >正文

C++类模板与泛型编程

C++类模板与泛型编程

类模板是C++泛型编程的核心,允许定义与类型无关的数据结构。模板在编译期实例化,为每种类型生成专门的代码。

类模板的基本定义使用template语法。

#include
#include
#include

template
class Array {
T* data_;
size_t size_;
public:
explicit Array(size_t n) : data_(new T[n]()), size_(n) {
std::cout << "Array of " << n << " elements\n";
}

~Array() { delete[] data_; }

Array(const Array& other) : data_(new T[other.size_]), size_(other.size_) {
for (size_t i = 0; i < size_; ++i) data_[i] = other.data_[i];
}

Array& operator=(const Array& other) {
if (this != &other) {
T* new_data = new T[other.size_];
for (size_t i = 0; i < other.size_; ++i) new_data[i] = other.data_[i];
delete[] data_;
data_ = new_data;
size_ = other.size_;
}
return *this;
}

T& operator[](size_t i) { return data_[i]; }
const T& operator[](size_t i) const { return data_[i]; }
size_t size() const { return size_; }

T* begin() { return data_; }
T* end() { return data_ + size_; }
const T* begin() const { return data_; }
const T* end() const { return data_ + size_; }
};

void class_template_basic() {
Array ints(5);
for (size_t i = 0; i < ints.size(); ++i) ints[i] = i * 10;

for (int v : ints) std::cout << v << " ";
std::cout << "\n";

Array doubles(3);
doubles[0] = 1.5;
doubles[1] = 2.5;
doubles[2] = 3.5;

Array strings(2);
strings[0] = "Hello";
strings[1] = "World";
}

模板参数可以是类型、非类型或模板模板参数。

template
class FixedArray {
T data_[N];
public:
T& operator[](size_t i) { return data_[i]; }
const T& operator[](size_t i) const { return data_[i]; }
constexpr size_t size() const { return N; }

T* begin() { return data_; }
T* end() { return data_ + N; }
};

void non_type_params() {
FixedArray arr;
for (size_t i = 0; i < arr.size(); ++i) arr[i] = i * i;

for (int v : arr) std::cout << v << " ";
std::cout << "\n";

std::cout << "Size: " << arr.size() << "\n";
}

模板特化为特定类型提供特殊实现。

template
class TypeProcessor {
public:
void process(T value) {
std::cout << "Generic: " << value << "\n";
}
};

template<>
class TypeProcessor {
public:
void process(int value) {
std::cout << "Specialized for int: " << value * 2 << "\n";
}
};

template<>
class TypeProcessor {
public:
void process(const std::string& value) {
std::cout << "String length: " << value.length() << "\n";
}
};

void template_specialization() {
TypeProcessor dp;
dp.process(3.14);

TypeProcessor ip;
ip.process(42);

TypeProcessor sp;
sp.process("Hello");
}

类模板偏特化。

template
class Resource {
public:
void use() {
std::cout << "Generic resource\n";
}
};

template
class Resource {
T* ptr_;
public:
explicit Resource(T* p) : ptr_(p) {}
~Resource() { delete ptr_; }

T* operator->() { return ptr_; }
T& operator*() { return *ptr_; }

void use() {
std::cout << "Managed resource\n";
}
};

template
class Resource {
T* ptr_;
public:
explicit Resource(T* p) : ptr_(p) {}

T* operator->() { return ptr_; }
T& operator*() { return *ptr_; }
};

继承类模板。

template
class Base {
protected:
T value_;
public:
explicit Base(T v) : value_(v) {}
virtual void show() { std::cout << value_ << "\n"; }
};

template
class Derived : public Base {
U extra_;
public:
Derived(T v, U e) : Base(v), extra_(e) {}
void show() override {
std::cout << this->value_ << ", " << extra_ << "\n";
}
};

void template_inheritance() {
Derived d(42, "answer");
d.show();
}

模板成员函数。

class Utils {
public:
template
static T max(T a, T b) {
return a > b ? a : b;
}

template
static T min(T a, T b) {
return a < b ? a : b;
}
};

void template_members() {
std::cout << "Max(3, 7): " << Utils::max(3, 7) << "\n";
std::cout << "Min(3.14, 2.71): " << Utils::min(3.14, 2.71) << "\n";
}

类模板是STL的基础,STL中的容器、迭代器和算法都是类模板的应用。

http://www.gsyq.cn/news/1554063.html

相关文章:

  • 【2026年6月】Q355E方管厂家推荐指南 - 多才菠萝
  • 2026年6月Q355NEH型钢厂家推荐指南 - 多才菠萝
  • 惠州黄金奢侈品回收门店实测推荐:惠奢汇(惠城旗舰店)领衔,中检认证+全品类回收的六大靠谱之选 - 生活测评小能手
  • 德阳瓷砖空鼓松动怎么修?本地口碑好的 5 家正规靠谱门店推荐 | 厨卫客厅专修(2026 最新) - 金修达家庭维修
  • 【2026年6月】Q355D方管厂家推荐指南 - 多才菠萝
  • 沈阳营业性演出许可证报批代办哪家好 - 速递信息
  • 佛山专业做跨境电商财税合规的公司 - 速递信息
  • 出生医学证明澳洲 NAATI 认证翻译怎么办理?澳方认可翻译 - 速递信息
  • Java手动实现SHA256算法:从原理到代码的深度解析与实践
  • 2026无锡2026正规漏水检测维修公司精选口碑榜TOP5权威推荐-精准定位检测漏水点-专业防水补漏堵漏维修、卫生间/厨房/屋顶/天沟/地下室/阳台防水漏水检测维修 - 安佳防水
  • 2026德阳本地人必选防水补漏检测维修公司靠谱服务商TOP5推荐:房屋渗漏水检测维修/卫生间/厨房/天花板/阳台/外墙渗漏水检测补漏维修-暗管漏水检测专业仪器精准定位漏水点 - 即刻修防水
  • 诊断证明澳洲NAATI 认证翻译怎么办理?办理渠道、材料、避坑全攻略 - 速递信息
  • 2026成都本地中古包包能不能回收?vintage 香奈儿、老款 LV 估价要点 - 逸程
  • Django毕业设计-基于 Python 的员工管理系统的设计与实现 基于 Python 的企业人事员工管理系统的设计与实现(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • 易语言XTEA算法实现IP地址加密解密实战指南
  • Android应用安全实战:Google Play Integrity API集成与风控策略详解
  • Gemma-4架构解析:PLE嵌入压缩与混合注意力的端侧推理设计
  • MATLAB单变量时序预测工具:灰狼算法自动调参GRU模型(含数据+完整可运行代码)
  • 2026年6月浴帘机实力厂家推荐,全自动对折浴帘机/全自动桌布机/雨衣机/浴帘机/磁铁机,浴帘机实力厂家选哪家 - 品牌推荐师
  • 2015考研数二真题(冲刺速通版)
  • DeepSeek真实多模态能力与推理模式解析
  • 2026揭阳2026正规漏水检测维修公司精选口碑榜TOP5权威推荐-精准定位检测漏水点-专业防水补漏堵漏维修、卫生间/厨房/屋顶/天沟/地下室/阳台防水漏水检测维修 - 安佳防水
  • 从NFA到DFA:用Python与Graphviz可视化子集构造法
  • 2026廊坊本地人必选防水补漏检测维修公司靠谱服务商TOP5推荐:房屋渗漏水检测维修/卫生间/厨房/天花板/阳台/外墙渗漏水检测补漏维修-暗管漏水检测专业仪器精准定位漏水点 - 即刻修防水
  • 石家庄冀联医学中专推荐:深耕医学中专教育,培养应用型医学人才 - 品牌推荐官
  • 深度解析VideoPose3D:时序卷积在3D人体姿态估计中的创新应用与实践指南
  • Java批量任务并发执行工具:自动调度+结果聚合,Eclipse工程直接运行
  • 2026年移动破碎设备厂家推荐:河南安舜机械全系产品适配多场景破碎需求 - 品牌推荐官
  • 北海瓷砖空鼓松动修复:本地口碑好的 5 家正规靠谱门店推荐 | 卫生间 / 客厅空鼓专修(2026 最新) - 金修达家庭维修
  • 场布元素实现详解