三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

C++ 泛型和特化

C++ 泛型和特化

泛型 (Generics)

泛型编程通过模板实现,它允许我们编写可以处理多种数据类型的代码,而不需要为每种类型重写代码

例子

函数模板示例

#include<iostream>#include<string>usingnamespacestd;// 泛型函数模板 - 可以比较任何可比较的类型template<typenameT>TgetMax(T a,T b){return(a>b)?a:b;}intmain(){// 使用泛型函数比较整数intintMax=getMax(10,25);cout<<"Max integer: "<<intMax<<endl;// 使用泛型函数比较浮点数doubledoubleMax=getMax(3.14,2.71);cout<<"Max double: "<<doubleMax<<endl;// 使用泛型函数比较字符串string strMax=getMax(string("apple"),string("banana"));cout<<"Max string: "<<strMax<<endl;return0;}

类模板

#include<iostream>usingnamespacestd;// 泛型类模板 - 可以存储任何类型的值template<typenameT>classContainer{private:T value;public:Container(T val):value(val){}TgetValue(){returnvalue;}voidsetValue(T val){value=val;}voiddisplay(){cout<<"Value: "<<value<<endl;}};intmain(){// 使用泛型类存储整数Container<int>intContainer(42);intContainer.display();// 使用泛型类存储字符串Container<string>strContainer("Hello, Templates!");strContainer.display();// 使用泛型类存储浮点数Container<double>doubleContainer(3.14159);doubleContainer.display();return0;}

特化(Specialization)

特化允许我们为模板的特定类型提供定制实现,当通用模板不能满足某些类型的特殊需求时非常有用

例子

函数模板

#include<iostream>#include<cstring>usingnamespacestd;// 通用模板函数template<typenameT>voidprintTypeInfo(T value){cout<<"Generic type: "<<value<<" (size: "<<sizeof(T)<<" bytes)"<<endl;}// 特化版本 - 针对const char*类型template<>voidprintTypeInfo<constchar*>(constchar*value){cout<<"C-string: "<<value<<" (length: "<<strlen(value)<<" characters)"<<endl;}// 特化版本 - 针对double类型template<>voidprintTypeInfo<double>(doublevalue){cout<<"Double precision: "<<value<<" (size: "<<sizeof(double)<<" bytes)"<<endl;}intmain(){inti=42;doubled=3.14159;constchar*str="Hello, Specialization!";printTypeInfo(i);// 使用通用模板printTypeInfo(d);// 使用double特化printTypeInfo(str);// 使用const char*特化return0;}

类模板

#include<iostream>#include<vector>usingnamespacestd;// 通用类模板template<typenameT>classDataProcessor{public:voidprocess(T data){cout<<"Processing generic data: "<<data<<endl;}};// 特化版本 - 针对vector<int>类型template<>classDataProcessor<vector<int>>{public:voidprocess(vector<int>data){cout<<"Processing vector of integers (size: "<<data.size()<<"):"<<endl;for(intval:data){cout<<val<<" ";}cout<<endl;}};// 特化版本 - 针对const char*类型template<>classDataProcessor<constchar*>{public:voidprocess(constchar*data){cout<<"Processing C-string: "<<data<<endl;cout<<"String length: "<<strlen(data)<<" characters"<<endl;}};intmain(){DataProcessor<int>intProcessor;intProcessor.process(42);DataProcessor<constchar*>strProcessor;strProcessor.process("Hello, World!");DataProcessor<vector<int>>vecProcessor;vecProcessor.process({1,2,3,4,5});return0;}

总结

泛型: 通过模板实现,允许编写与类型无关的通用代码,提高代码复用性

特化: 为特定类型提供定制实现,处理通用模板无法满足的特殊情况

← 返回列表