网站应具有的功能模块,今科网站建设费用,广西南宁建设银行招聘网站,哪些网站可以做图片链接函数模板是C中一种通用编程技术#xff0c;允许编写可以适用于多种数据类型的函数#xff0c;而无需为每种数据类型编写不同的函数。函数模板通过参数化类型来实现通用性#xff0c;可以在不同情况下自动生成具体的函数代码。
目录
1.函数模板的定义
2.函数模板的使用
… 函数模板是C中一种通用编程技术允许编写可以适用于多种数据类型的函数而无需为每种数据类型编写不同的函数。函数模板通过参数化类型来实现通用性可以在不同情况下自动生成具体的函数代码。
目录
1.函数模板的定义
2.函数模板的使用
3.函数模板与普通函数
4.函数模板的局限性 1.函数模板的定义
函数模板以 template 关键字开始后面跟着尖括号其中包含一个或多个类型参数。
template typename T
T myMax(T a, T b) {return (a b) ? a : b;
}如果我需要再对两个float类型的变量进⾏交换是不是还需要再写⼀个函数呢需要交换的变量的类型越多我就越需要写更多的重复的函数而且⼀旦需求变更了交换的逻辑需要做⼀些小小的改变。那么每⼀个函数我都得修改⼀下非常的复杂 我如果能够设计⼀个通用的函数能够把类型当作参数传递到这个函数中就可以简化很多很多的⼯作了这就是函数模板 // 需求我想要设计⼀个函数实现两个int变量的值的交换
void mySwap(int a, int b) {int tmp a;a b;b tmp;
}
// 需求我想要设计⼀个函数实现两个double变量的值的交换
void mySwap(double a, double b) {double tmp a;a b;b tmp;
}
templatetypename T
void mySwap(T a, T b) {T tmp a;a b;b tmp;
}
2.函数模板的使用
templateclass T
void mySwap(T a, T b) {T tmp a;a b;b tmp;
}
int main() {int a 10, b 20;double x 3.14, y 0.99;// 1. 显式指定类型mySwapint(a, b);// 2. 可以⾃动根据实参的类型进⾏推导mySwap(a, b); // 这⾥调⽤的mySwap中类型T被推导为int类型mySwap(x, y); // 这⾥调⽤的mySwap中类型T被推导为double类型// 注意事项: 类型推导的时候需要保证⼀致性。不满⾜⼀致性⽆法推导。// 例如 mySwap(a, y); // 第⼀个实参a是int类型推导T的类型为int第⼆个实参y是double类型推导T的类型为double
不⼀致return 0;
}
3.函数模板与普通函数 在以下示例中add 函数模板可以处理 int 和 double 类型的参数而普通函数 add 仅能处理 int 类型参数。函数模板实现了更广泛的通用性和类型安全性。
// 函数模板
template typename T
T add(T a, T b) {return a b;
}// 普通函数
int add(int a, int b) {return a b;
}int main() {int x 5, y 10;double p 3.14, q 2.71;int result1 add(x, y); // 调用普通函数double result2 add(p, q); // 调用函数模板return 0;
}4.函数模板的局限性
函数模板虽然很通用但并不是万能的有的时候也会出现不适配的情况。
templateclass T
bool compare(const T t1, const T t2) {return t1 t2;
} 对于上述的模板函数来说如果是比较整形、浮点型甚至字符型的数据是没有问题的。可是如果我们设置为person类呢两个person对象无法进行大小比较这里也就自然的出现了问题。 那么如何解决这样的问题呢 1. 重载运算符重载运算符。 2. 通过函数模板的重载来解决。 函数模板的重载就是为了解决特定类型的对象的问题通过函数模板的重载可以为这些特定的数据类型提供具像化的模板。 class Person {
public:int age;
};
templateclass T
bool compare(const T t1, const T t2) {return t1 t2;
}
template
bool comparePerson(const Person p1, const Person p2) {return p1.age p2.age;
}
int main() {Person p1;p1.age 15;Person p2;p2.age 12;cout compare(p1, p2) endl;return 0;
} 由于我们在特化的 compare 函数中定义了如何比较两个 Person 对象的年龄属性因此在 main 函数中调用 compare(p1, p2) 时实际上是调用了特化版本的 compare 函数返回的结果是根据年龄比较的结果。