函数模板实践
做了4个试验,test5没做,但是给了结论。
直接贴实践过的代码
#include <iostream>
#include <string>
template<typename T>
void swapval(T& val1, T& val2){
T vector = val1;
val1 = val2;
val2 = vector;
}
/*****普通函数******/
std::string sort(std::string array[], int len){
std::cout << "我是普通函数sort" << std::endl;
for(int i=0; i< len; i++){
for(int j=i+1; j<len; j++){
if(array[i] > array[j]){
swapval(array[i], array[j]);
}
}
}
return array[0];
}
/*****函数模板******/
template<typename T>
T sort(T array[], int len){
std::cout << "我是函数模板sort" << std::endl;
for(int i=0; i< len; i++){
for(int j=i+1; j<len; j++){
if(array[i] > array[j]){
swapval(array[i], array[j]);
}
}
}
return array[0];
}
template<typename T>
T print(T array[], int len){
for(int i=0; i< len; i++){
std::cout << array[i] << " ";
}
std::cout << std::endl;
return array[0];
}
typedef std::string (t_func_str)(std::string array[], int len);
int main(int argc, char* argv[]){
/*********
test1: 函数基本测试之int
*******/
int array1[8] = {8, 7, 9, 4, 3, 6, 8, 1};
sort<int>(array1, sizeof(array1)/sizeof(int));
print<int>(array1, sizeof(array1)/sizeof(int));
std::cout << "test1 over " << std::endl;
/*********
test2: 函数基本测试之float
*******/
float array2[8] = {8.31, 7, 9.52, 4, 3, 6, 8.0, 1.2345};
sort(array2, sizeof(array2)/sizeof(float)); /****类型自动推导****/
print<float>(array2, sizeof(array2)/sizeof(float)); /****显式指定类型****/
std::cout << "test2 over " << std::endl;
/*********
test3: 函数基本测试之string
*******/
std::string array3[5] = {"aa", "bb", "ccc", "ab", "ba"};
std::string min_3 = sort(array3, 5);
std::cout << "min :" << min_3 << std::endl;
print<std::string>(array3, 5);
std::cout << "test3 over " << std::endl;
/*********
test4: 当函数模板 遇上函数重载,调用谁? (这里存在普通函数sort 和 函数模板sort)
*******/
std::string array4[5] = {"aac", "bbd", "c", "abb", "ba"};
#if 1
t_func_str * pfunc_str = sort<>; /*** 如果使能这句代码,将使用函数模板sort
且编译器自动推导泛型T 为std::string .******/
#else
t_func_str * pfunc_str = sort /*** 如果使能这句代码,将使用普通函数sort .******/
#endif
std::string min_4 = pfunc_str(array4, 5);
std::cout << "min :" << min_4 << std::endl;
print<std::string>(array4, 5);
std::cout << "test4 over " << std::endl;
/*********
test5: 当函数模板 遇上隐式类型转换,不记录实验过程,只贴结论:
*******/
return 0;
}
test1 、test2 小结:
因为不存在参数类型为int 和float的普通函数sort,所以这两个例子内只能匹配到函数模板sort。
test3 、test4 小结:
当函数模板 遇上函数重载,编译器将面临多个选择。
此时编译器将优先选择使用普通函数的重载版本。
若函数名后使用<>指定使用函数模板,则会使用函数模板。
test5结论:
函数模板本身不支持隐式类型转换,
自动推导类型时,必须严格匹配。
显示类型指定时,能够进行隐式类型转换。
.
/************* 社会的有色眼光是:博士生、研究生、本科生、车间工人; 重点大学高材生、普通院校、二流院校、野鸡大学; 年薪百万、五十万、五万; 这些都只是帽子,可以失败千百次,但我和社会都觉得,人只要成功一次,就能换一顶帽子,只是社会看不见你之前的失败的帽子。 当然,换帽子决不是最终目的,走好自己的路就行。 杭州.大话西游 *******/