【C++】59.类模板的深度解剖

类模板可以定义任意多个不同类型的参数

template <typename T1, typename T2>
class Test
{
  public:
      void Add(T1 a, T2 b);
};

Test<int, float>t
//一一指定参数类型。

 

类模板的特化

根据需要分开实现(可以在特化的地方实现不同的函数),本质还是同一个模板,将一个模板具体分到不同对象的实现

(部分特化,完全特化), 并不是从新定义一个新的模板,只是上面的一个特殊实现。

template <typename T1, typename T2>
class Test
{};

// 部分特化(用特点规则约束类型参数)
template <typename T>  // 当 Test 类模板的两个类型参数完全相同的时候,用这个实现
class Test <T, T>
{};

// 完全特化(完全显示指定类型参数)
template <>
class Test<int, int>
{};

类模板特化注意事项:

 

问题:

1.类模板特化与重定义有区别嘛?

2.函数模板可以特化嘛?(完全特化和函数重载有什么区别)

 

工程中的建议

当需要重载函数模板时,优先考虑使用模板特化;

当模板特化无法满足需求时,在使用函数重载

(两个都在的时候,编译器默认选择全局的函数重载)

bool Equal<double>(double a, double b)
{
    const double delta = 0.00000000000001;
    double r = a - b;
    
    cout << "bool Equal<double>(double a, double b)" << endl;
    
    return (-delta < r) && (r < delta);
}

bool Equal(double a, double b)  // 函数重载版本
{
    const double delta = 0.00000000000001;
    double r = a - b;
    
    cout << "bool Equal(double a, double b)" << endl;
    
    return (-delta < r) && (r < delta);
}

cout << Equal<>(0.01, 0.01) << endl;
// 限定匹配函数模板

cout << Equal(0.01, 0.01) << endl;
//优选选择全局函数

 

小结:

1.类模板可以定义任意多个不同类型的参数

2.类模板被部分特化和完全特化

3.特化的本质是模板的分开实现

4.函数模板只支持完全特化

5工程中使用模板特化代替类(函数)重定义

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值