当前位置: 首页 > 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.jsqmd.com/news/1042156/

相关文章:

  • 趣谈嵌入式软硬件开发
  • 【2026年6月】Q355E方管厂家推荐指南 - 多才菠萝
  • Gemini 3多模态系统级协同:视觉定位、跨模态对齐与工具内生化
  • 2026杭州万金汇金裕恒福满多琳弘湾黄金回收价格参考 - 润富黄金回收
  • 考研政治网课哪家押题准? - 新闻快传
  • ClaudeCode开源解析:多模态AI Agent如何实现真实电脑操作
  • 惠州黄金奢侈品回收门店实测推荐:惠奢汇(惠城旗舰店)领衔,中检认证+全品类回收的六大靠谱之选 - 生活测评小能手
  • 2026昭通2026正规漏水检测维修公司精选口碑榜TOP5权威推荐-精准定位检测漏水点-专业防水补漏堵漏维修、卫生间/厨房/屋顶/天沟/地下室/阳台防水漏水检测维修 - 安佳防水
  • 2026湖州黄金回收全攻略 三家实体门店横向实测附避坑指南 - 润富黄金回收
  • 嵌入式Linux应用开发,有些坑真的没处说理去
  • 【2026年6月】Q355D方管厂家推荐指南 - 多才菠萝
  • 2026年6月Q355NEH型钢厂家推荐指南 - 多才菠萝
  • 接口自动化测试CI/CD实战:从脚本到流水线的工程化构建
  • 德阳瓷砖空鼓松动怎么修?本地口碑好的 5 家正规靠谱门店推荐 | 厨卫客厅专修(2026 最新) - 金修达家庭维修
  • 沈阳营业性演出许可证报批代办哪家好 - 速递信息
  • Gemini 1.0深度解析:多模态融合与实时网络感知技术实践
  • 2026年6月Q355C工字钢厂家推荐指南 - 多才菠萝
  • 沈阳翻译盖章怎么办理?2026最新流程避坑指南 - 速递信息
  • SPI协议深度解析:从CPHA/CPOL时序到OVRF/MODF错误处理实战
  • 佛山专业做跨境电商财税合规的公司 - 速递信息
  • 2026年6月最新帝舵中国官方售后服务电话及客服中心地址网点 - 亨得利官方服务中心
  • Java手动实现SHA256算法:从原理到代码的深度解析与实践
  • 出生医学证明澳洲 NAATI 认证翻译怎么办理?澳方认可翻译 - 速递信息
  • 从F12抓包到Postman自动化:电商接口测试实战全流程解析
  • 2026无锡2026正规漏水检测维修公司精选口碑榜TOP5权威推荐-精准定位检测漏水点-专业防水补漏堵漏维修、卫生间/厨房/屋顶/天沟/地下室/阳台防水漏水检测维修 - 安佳防水
  • Python测试实战:pytest单元与集成测试的完整指南
  • 2026德阳本地人必选防水补漏检测维修公司靠谱服务商TOP5推荐:房屋渗漏水检测维修/卫生间/厨房/天花板/阳台/外墙渗漏水检测补漏维修-暗管漏水检测专业仪器精准定位漏水点 - 即刻修防水
  • 宝鸡瓷砖空鼓松动怎么修?本地口碑好的 5 家正规靠谱门店推荐 | 厨卫客厅专修(2026 最新) - 金修达家庭维修
  • 垃圾车和渣土车实时识别工具包:YOLOv5训练模型+评估图表+一键推理脚本
  • C语言变量内存分配全解析:从存储期到动态内存管理