C++ 函数模板

一、函数模板

函数模板的一般说明形式如下:

template <模板参数表>
<返回值类型><函数名>(模板参数形参表)
{
   // 函数定义体  
}

在<模型参数表>中的每个类型参数都必须在模板函数形参表中得到使用。

#include <iostream>
using namespace std;

template<class T>
void PrintArray(T arr[], int len) {
    for (int i = 0; i < len; i++)
    {
        cout << arr[i] << " ";
    }
    cout << endl;
}

template<class T>
T max(T a, T b)
{
    return a > b ? a : b;
}

int main()
{
    char c1 = 'a';
    char c2 = 'b';

    std::cout << "Hello World!\n";
    // 自动推导参数类型
    cout << max(1, 2) << endl;
    // 也可以显式指定类型
    cout << max<char>(c1, c2) << endl;
}

重载函数

承接上述代码。

template<class T>
T max(T a, T b, T c)
{
    cout << "In overload version1" << endl;
    // 具体代码
}
template<class T>
T* max(T *a, T *b)
{
    cout << "In overload version2" << endl;
    // 具体代码
}

二、函数模板特化

函数模板的特化必须把所有的模版参数全部指定。

  1. 模板特化时,必须要先有基础的模板函数
  2. 特化的函数名,参数列表要和基础模板函数相同
  3. template 后直接跟<> 里面不用写类型
template<>
char* max(char* a, char* b)
{
    return strcmp(a, b) > 0 ? a : b;
}

三、函数模板和普通函数

1、区别

  • 函数模板不允许自动类型转化
  • 普通函数能够自动进行类型转化

2、调用规则

c++编译器优先考虑普通函数

#include <iostream>
using namespace std;

template<class T>
T max(T a, T b)
{
    cout << "In generic version template " << endl;
    return a > b ? a : b;
}

// 特化
template<>
const char* max(const char* a, const char* b)
{
    cout << "In special version template " << endl;
    return strcmp(a, b) > 0 ? a : b;
}

// 普通函数
const char* max(const char* a,const char* b)
{
    cout << "In normal func " << endl;
    return strcmp(a, b) > 0 ? a : b;
}

int main()
{
    char c1 = 'a';
    char c2 = 'b';

    const char *c3 = "hello";
    const char *c4 = "world";

    std::cout << "Hello World!\n";
    // 自动推导参数类型
    cout << max(1, 2) << endl;
    // 也可以显式指定类型
    cout << max<char>(c1, c2) << endl;
    // 优先调用普通函数
    cout << max(c3, c4) << endl;
    // 通过<>使用空参数列表强制调用函数模板
    cout << max<>(c3, c4) << endl;
}

原文链接: https://www.cnblogs.com/tamya/p/15760543.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/187237

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 上午11:16
下一篇 2023年2月12日 上午11:16

相关推荐