关于模板函数具体化实例化的问题

模板函数式为了减少书写代码的工作量,可以讲不同类型的参数适用同一个函数模板,但是,如果参数是一个结构体中的某个元素,如果继续使用模板函数的话,就会对整个结构体参数进项操作,达不到目的,这时候,就引入了显式具体化。

显式具体化也是基于函数模板的,只不过在函数模板的基础上,添加一个专门针对特定类型的、实现方式不同的具体化函数。

template<>void swap<job>(job &a, job &b)
{
int salary;
salary = a.salary;
a.salary = b.salary;
b.salary = salary;
}

显式实例化只需声明,不需要重新定义。编译器根据模板实现实例声明和实例定义。

在代码中包含模板本身并不会生成函数定义,它只是一个用于生成函数定义的方案。编译器使用模板为特定类型生成函数定义时,得到的是模板实例。其实模板实例就是调用模板时编译器为这个类型的参数定义了一个函数。
当显式实例化模板时,在使用模板之前,编译器根据显式实例化指定的类型生成模板实例。

隐式实例化指的是:在使用模板之前,编译器不生成模板的声明和定义实例。只有当使用模板时,编译器才根据模板定义生成相应类型的实例。、

template<class T>

void Swap(T&,T&);


template<>void Swap<job>(job &,job&);

int main()

{

template void Swap<char>(char &,char&);

short a,b;

Swap(a,b);

job n,m;

Swap(n,m);

char g,h;

Swap(g,h);

}

编译器看到char 的显示实例化后,将使用模板定义来生成Swap()的char版本。对于其他SWAP()调用,编译器根据函数调用中世纪使用的参数,生成相应的版本,例如,当编译器看到函数调用Swap(a,b)后,将生成Swap的short版本,因为两个参数的类型都是short ,当编译器看到Swap(n,m)后,将使用job类型提供的独立定义(显示具体化)。当编译器看到swap(g,h),将使用处理显示实例化时生成的模板具体化。

### C++ 模板函数实例化过程解释 #### 函数模板的概念 C++ 中的函数模板提供了一种机制来编写泛型代码,使得相同的逻辑可以应用于多种数据类型。通过使用模板参数代替具体的类型名称,可以在不改变算法的情况下处理不同类型的数据。 #### 隐式实例化 当调用一个未具体化模板函数时,编译器会尝试根据传递给该函数的实际参数推断出合适的类型并自动生成相应的函数版本[^3]。例如: ```cpp template<class T> T A(T a, T b) { T c = a - b; std::cout << "普通模板函数" << c << std::endl; return c; } int main() { double d1 = 5.5, d2 = 2.2; auto result = A(d1, d2); } ``` 在这个例子中,`A<double>` 将由编译器自动创建出来以适应 `double` 类型的操作数。 #### 显式实例化 有时希望强制让编译器为某个特定类型生成函数定义而不是依赖于隐式的类型推导,则可以通过显式指定要实例化的类型来到这一点[^2]。这通常发生在头文件中声明模板之后但在源文件中的实现之前完成: ```cpp // 声明部分 extern template int A<int>(int, int); // 定义部分 template int A<int>(int, int); ``` 这样可以让编译器知道应该提前准备好这些特殊版本而不必等到实际使用它们的时候再去这件事。 #### 显示特化(具体化) 对于某些特殊情况下的需求,可能还需要进一步定制行为。这时就可以利用显示特化功能来针对某一特定类型给出完全不同的实现方法[^4]: ```cpp template<> int A<int>(int a, int b) { int c = a - b; std::cout << "显式具体化" << c << std::endl; return c; } ``` 这里定义了一个专门用于整数类型的 `A()` 版本,它会在遇到整形输入时优先选用此版而非通用模板。 综上所述,在上述过程中可以看到从最基础的形式即简单地接受任意类型作为参数直到能够精确控制每一种情况的行为模式之间的演变路径。每当涉及到新类型或是想要优化现有性能瓶颈的地方都可以考虑采用这种方法论来进行开发工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值