类模板,函数模板,及其特化

一 使用模板的意义

当我们进行int型数据交换时调用swap函数:

void swap(int &a , int &b)
{
	*a ^= *b;
	*b ^= *a;
	*a ^= *b;
}

但该函数面对double,char,long等其他类型时,不适用
解决办法:重载

void swap(double &a , double &b)
{
	*a ^= *b;
	*b ^= *a;
	*a ^= *b;
}
void swap(char &a , char &b)
{
	*a ^= *b;
	*b ^= *a;
	*a ^= *b;
}

尽管可以解决问题,但代码冗余,没有代码复用,且主体出错时,需要全部重新修改,不推荐


从而C++使用模板,即泛型编程的概念,来解决类型不同,函数体或者类体相同的问题 。

将类型参数化,从而形成模板。

**注:
1,模板需要实例化才能使用,只不过将实例化过程交给编译器完成(重载是人来进行实例化),生成对应类型的函数体,故模板不能够提高代码效率

2,特别关注:模板调用时,类型严格匹配,不允许类型隐式转换

3,模板即类型参数化,特化即类型确定化

**


二 类模板

结构:

template <typename T1 , typename T2>
class myclass{
     T2 fun(T1){}
     T1 data1;
     T2 data2;
};

三 函数模板

结构

template<typename T1 ,typename T2>
T1 funtion(T2 data){
}

四 类模板全特化和偏特化:即确定类型参数

1,全特化结构

template <>
class myclass<int,char>{
     char fun(int){}
     int data1;
     char data2;
};

2,偏特化结构

template <typename T1>
class myclass<T1,int>{
     int fun(T1){}
     T1 data1;
     int data2;
};

四 函数模板全特化:对于函数直接进行重载

结构:

template<>
int funtion(char data){
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
函数模板是一种通用的函数定义,它允许编写能够处理多种不同类型的数据的函数函数模板的定义以关键字 `template` 开头,后面跟着模板参数列表和函数的原型。 例如,以下是一个简单的函数模板,用于交换两个值: ```c++ template <typename T> void swap(T& a, T& b) { T temp = a; a = b; b = temp; } ``` 上述代码中,`typename T` 表示这是一个类型参数,可以接受任何类型的数据。在函数体中,我们只是简单地交换了两个值。 使用函数模板时,需要将具体的类型传递给模板参数,例如: ```c++ int a = 5, b = 10; swap<int>(a, b); // 交换 a 和 b 的值 ``` 在上述示例中,我们显式地将 `int` 作为模板参数传递给 `swap` 函数函数模板还支持全特化,这意味着我们可以为特定的类型提供一个特定的实现。全特化使用关键字 `template<>` 手动指定模板参数列表中的类型,并提供一个特定的函数实现。 例如,以下是一个针对 `char` 类型的 `swap` 函数的全特化: ```c++ template <> void swap<char>(char& a, char& b) { char temp = a; a = b; b = temp; std::cout << "Swapping chars!" << std::endl; } ``` 上述代码中,我们使用了 `template<>` 关键字显示地声明了一个全特化函数,指定了模板参数为 `char`。 当我们调用 `swap` 函数,并将 `char` 类型的变量作为参数传递时,编译器将自动选择调用这个全特化版本的函数。 需要注意的是,全特化版本的函数应该在头文件中进行声明和定义,以便编译器能够正确地实例化这些函数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值