C++——类模板的概念和意义
1.一些类主要用于存储和组织数据元素类中数据组织的方式和数据元素的具体类型无关只关注需要实现的功能如数组类、链表类、Stack类、Queue类2.类模板的应用1只能显示指定具体类型无法自动推导2使用具体类型Type定义对象3.编译器对类模板的处理方式和函数模板相同1从类模板通过具体类型产生不同的类2在声明的地方对类模板代码本身进行编译3在使用的地方对参数替换后的代码进行编译#include iostream #includestring using namespace std; template typename T class Operator { public: T add(T a, T b) { return a b; } T minus(T a, T b) { return a - b; } T multiply(T a, T b) { return a * b; } T divide(T a, T b) { return a / b; } }; int main() { Operatorint op1; cout op1.add(1, 2) endl; Operatorstring op2; cout op2.add(ab, cd) endl; // cout op2.minus(ab, cd) endl; 报错因为string类型没有减法运算 return 0; }所以要重载string类型的减法运算符#include iostream #includestring using namespace std; template typename T class Operator { public: T add(T a, T b) { return a b; } T minus(T a, T b) { return a - b; } T multiply(T a, T b) { return a * b; } T divide(T a, T b) { return a / b; } }; string operator- (const string a, const string r) { return Minus; } int main() { Operatorint op1; cout op1.add(1, 2) endl; //3 Operatorstring op2; cout op2.add(ab, cd) endl; //abcd cout op2.minus(ab, cd) endl; //Minus return 0; }4.类模板的工程应用1类模板必须在头文件中定义2类模板不能分开实现在不同的文件中3类模板外部定义的成员函数需要加上模板声明Complex.h#pragma once //声明成员函数 template typename T class Operator { public: T add(T a, T b); T minus(T a, T b); T multiply(T a, T b); T divide(T a, T b); }; //定义成员函数 template typename T T OperatorT::add(T a, T b) { return a b; } template typename T T OperatorT::minus(T a, T b) { return a - b; } template typename T T OperatorT::multiply(T a, T b) { return a * b; } template typename T T OperatorT::divide(T a, T b) { return a / b; }main.cpp#include iostream #includestring using namespace std; #include Complex.h int main() { Operatorint op1; cout op1.add(1, 2) endl; //3 cout op1.minus(1, 2) endl; //-1 cout op1.multiply(1, 2) endl; //2 cout op1.divide(1, 2) endl; //0 }5.类模板可以定义任意多个不同的类型参数类模板可以被特化当通用类模板对某个 / 某些特定类型不适用、需要定制逻辑时为这些类型单独编写专属的模板实现。1指定类模板的特定实现2部分类型参数必须显示指定3根据类型参数分开实现类模板部分特化用特定规则约束类型参数完全特化完全显示指定类型参数部分特化#include iostream #includestring using namespace std; template typename T1, typename T2 class Test { public: void add(T1 a, T2 b) { cout void add(T1 a, T2 b) endl; cout a b endl; } }; template typename T class TestT, T { //当Test类模板的两个类型参数完全相同时使用这个实现 public: void add(T a, T b) { cout void add(T a, T b) endl; cout a b endl; } }; int main() { Testint, float t1; t1.add(1, 2.5); Testlong, long t2; t2.add(5, 5); return 0; }运行结果void add(T1 a, T2 b)3.5void add(T a, T b)10完全特化完全特化表示显示指定类型参数,模板声明只需写成template,并在类名右侧指定参数#include iostream #includestring using namespace std; template typename T1, typename T2 class Test { public: void add(T1 a, T2 b) { cout void add(T1 a, T2 b) endl; cout a b endl; } }; template typename T1,typename T2 class TestT1*, T2* { public: void add(T1* a, T2* b) { cout void add(T1 * a, T2 * b) endl; cout *a *b endl; } }; //完全特化 template class Testvoid*, void* { public: void add(void* a, void* b) { //当T1void* 并且 T2void* 时 cout void add(void* a, void* b) endl; cout Error... endl; } }; int main() { Testint, float t1; t1.add(1, 2.5); Testvoid*, void* t3; t3.add(NULL, NULL); Testint*, double* t4; int a 1; double b 0.1; t4.add(a, b); return 0; }运行结果void add(T1 a, T2 b)3.5void add(void* a, void* b)Error...void add(T1 * a, T2 * b)1.16.类模板特化注意事项1特化只是模板的分开实现本质上是同一个类模板2特化类模板的使用方式是统一的必须显示指定每一个类型参数类模板特化和重定义的区别重定义一个类模板和一个新类或者两个类模板特化以统一的方式使用类模板和特化类编译器自动优先选择特化类函数模板也可以特化但只能完全特化#include iostream #includestring using namespace std; ////完全特化 //template //class Testvoid*, void* { //public: // void add(void* a, void* b) { //当T1void* 并且 T2void* 时 // cout void add(void* a, void* b) endl; // cout Error... endl; // } //}; //对上面的特化的重定义 class Test_Void { public: void add(void* a, void* b) { cout void add(void* a, void* b) endl; } }; //函数模板 templatetypename T bool Equal(T a, T b) { cout bool Equal(T a, T b) endl; return a b; } //函数模板的完全特化 template bool Equaldouble(double a, double b) { const double delta 0.00000000000001; double r a - b; cout bool Equaldouble(double a, double b) endl; return (-delta r) (r delta); } int main() { //Testvoid*, void* t3; Test_Void t3; t3.add(NULL, NULL); cout Equal(1, 1) endl; cout Equaldouble(0.001, 0.001) endl; //由于浮点数在内存中的表示是不精确的所以不能用比较所以要用函数的完全特化 return 0; }运行结果void add(void* a, void* b)bool Equal(T a, T b)1bool Equaldouble(double a, double b)1
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2414561.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!