您的位置:首页 > 房产 > 家装 > 【函数模板】函数模板的特化

【函数模板】函数模板的特化

2025/3/14 10:56:37 来源:https://blog.csdn.net/Antonio915/article/details/141762009  浏览:    关键词:【函数模板】函数模板的特化

一、函数模板的泛化

函数模板的泛化就是一般情况下写的函数模板,不存在指定类型。
在这里插入图片描述

template<typename T,typename R>
void Func(T& x,R& y ) {std::cout << "调用了Func的泛化版本\n";std::cout << x << "  " << y << "\n";
}

二、函数模板的全特化

函数模板的全特化就是指定函数的模板的全部类型。
全特化模板必须在模板前加入 t e m p l a t e < > template<> template<>
并且,传入的参数限制必须保持一致,否则无法通过编译。如&,*等限制。
而全特化后的 < i n t , d o u b l e > <int,double> <int,double>可以无需指定
在这里插入图片描述

//全特化
template<>
void Func<int,double>(int& x,double& y) {std::cout << "调用了Func的全特化版本\n";std::cout << x << "\n";
}

输出结果如下:
在这里插入图片描述
注意全特化和普通函数重载函数模板的区别。
在这里插入图片描述
注意下面的代码

//泛化
template<typename T,typename R>
void Func(T& x,R& y ) {std::cout << "调用了Func的泛化版本\n";std::cout << x << "  " << y << "\n";
}//全特化
template<>
void Func<int,double>(int& x,double& y) {std::cout << "调用了Func的全特化版本\n";std::cout << x << " " << y << "\n";
}void Func(int& x, double& y) {std::cout << "调用了Func的普通函数\n";std::cout << x << " " << y << "\n";
}
void Test1() {int x = 1, y = 2;Func(x, y);double z = 3.0;Func(x, z);}

我们在全特化的版本下又重载了一个普通函数的版本, 此时调用的就是 F u n c Func Func的普通函数版本了
在这里插入图片描述

这就引发了调用优先级的问题
在这里插入图片描述

三、函数模板的偏特化

函数模板不存在偏特化。

以下代码将编译失败

template<typename T>
void Func<T, double>(T& x, double& y) {std::cout << "调用了Func的偏特化版本\n";std::cout << x << "\n";
}

在这里插入图片描述如果需要,我们可以使用函数模板的重载来实现偏特化,如下:

//重载函数模板
template<typename T>
void Func(T& x, double& y) {std::cout << "调用了Func的偏特化版本\n";std::cout << x << "\n";
}

具体而言,就是重载不同的参数个数。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com