C++基础之函数模板以及为什么需要显式具体化

相关概念:

#include <iostream>
using namespace std;

//通用模板
template <typename T>
void func1(T a, T b) {
    cout << a << " " << b << endl;
}

//显示具体化(explicit specialization)
//指出当参数为int时通过此函数而不是通用模板生成实例
template <>
void func1<int>(int a, int b) {
    cout << "func1" << endl;
}

//实例化在生成的可执行文件中生成真正的指令
template void func1<char>(char, char);  //显式实例化(explicit instantiation)

int main() {
    double x = 1.0, y = 1.0;
    func1(x, y);  //隐式实例化
    func1<string>("a", "b");  //显式实例化
    return 1;
}

显式具体化可以为某种类型的参数定义不同于通用模板的实现,匹配时显式实例化的模板优先于通用模板。但也可以为特定的函数类型定义非模板函数,匹配时非模板函数优先于模板函数,比如:

#include <iostream>
using namespace std;

template <typename T>
void func1(T a, T b) {
    cout << a << " " << b << endl;
}

template <>
void func1<int>(int a, int b) {
    cout << "func1" << endl;
}

void func1(int a, int b) {
    cout << "another func1";
}

int main() {
    int x = 0, y = 0;
    func1(x, y);  //another func1
    return 1;

那为什么还需要显式具体化呢?可能在某些情况下编译器无法自动推导出期望的参数类型,比如需要类型转换的情况,这时候可以强制实例化显式具体化的模板,而不是完全依赖编译器的自动推导机制:

#include <iostream>
using namespace std;

template <typename T>
void func1(T a, T b) {
    cout << a << " " << b << endl;
}

template <>
void func1<short>(short a, short b) {
    cout << "func1" << endl;
}

void func1(short a, short b) {
    cout << "another func1";
}

int main() {
    int x = INT_MAX;
    int y = INT_MAX;
    func1(x, y);  //使用通用模板
    func1<short>(x, y);  //使用显式具体化
    return 1;
}

当然这个例子不太具有代表性...理解意思即可。

### C++ 函数模板实例化 在C++中,为了实现函数模板实例化,可以在 `template` 关键字之后紧跟函数声明(而非定义),并附带具体的模板参数。这种方允许程序员提前告知编译器哪些类型的模板实例将会被使用,从而优化链接过程中的对象文件生成[^2]。 对于给定的例子而言: ```cpp #include <iostream> using namespace std; // 定义一个通用版本的A函数模板 template<class T> T A(T a, T b) { T c = a - b; cout << "普通模板函数" << c << endl; return c; } // 实例化的声明部分应该放在源文件外部或者头文件内部 template int A<int>(int a, int b); ``` 上述代码展示了如何对外部使用的特定类型(int型)执行实例化操作。需要注意的是,实际的函数体仍然保持不变,只是增加了针对该类型的单独声明语句来触发编译期间的具体化处理。 当涉及到类成员函数模板时,情况略有不同。无论是普通的类还是模板类,都可以拥有作为其一部分存在的成员函数模板。然而,这些成员函数模板不允许是虚函数。一旦编译器遇到了调用此类成员函数的地方,它会自动尝试创建相应的实例[^3]。 至于更复杂的场景——即嵌套于其他模板结构之内的函数模板,则需遵循一定的规则来进行特化或实例化工作。特别是当涉及跨多个翻译单元共享相同逻辑的需求时,合理运用实例化能够有效减少重复编译带来的开销,并有助于管理大型项目中的依赖关系[^4]。 #### 注意事项 - 对于全局作用域下的简单函数模板来说,只需要提供一次性的实例化声明即可满足需求。 - 如果是在类的作用范围内,则可能还需要考虑访问权限以及友元声明等因素的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值