c++中的函数模板

c++中的函数模板

1.函数模板形式

c++中模板函数,需要使用关键字templatetypename或者class。typename和class在模板函数中的使用相同,绝大部分情况下可以互换。
模板函数需要在函数开头中使用template<typename _T>或者template<class _T>

2.使用函数模板原因:

重载可以实现一个函数名多用,只要输入的类型不同或者个数不同,可以将功能相同或者类似函数用同一个名来定义。但是需要定义每一个函数,使得代码不够简洁,重复使用也不高。解决这个问题的方法就是使用函数模板,可以定义一个函数模板,多个类型都可以使用。

3.函数模板的实例

函数模板在编译的时候不会生产实例,在调用该函数模板的时候,编译器生成对于的实例函数。

4.普通函数使用:

#include <iostream>
#include <string>
#include <vector>
using std::vector;
using std::string;
using std::cin;
using std::cout;
using std::endl;

void check_and_print(const vector<int>& vec)
{
    cout << "size: " << vec.size() << "  content: [";
    for (auto it = vec.begin(); it != vec.end(); ++it)
        cout << *it << ",";
    if(vec.size()!=0)
        cout<<"\b";
    cout << "]\n" << endl;
}
void check_and_print(const vector<string>& vec)
{

    cout << "size: " << vec.size() << "  content: [";
    for (auto it = vec.begin(); it != vec.end(); ++it)
        cout << *it << ",";
    if(vec.size()!=0)
        cout<<"\b";
    cout << "]\n" << endl;
}

void test01()
{
    vector<int> v1;
    vector<int> v2(10);
    vector<int> v3(10, 42);
    vector<int> v4{ 10 };
    vector<int> v5{ 10, 42 };
    vector<string> v6{ 10 };
    vector<string> v7{ 10, "hi" };

    check_and_print(v1);
    check_and_print(v2);
    check_and_print(v3);
    check_and_print(v4);
    check_and_print(v5);
    check_and_print(v6);
    check_and_print(v7);
}

int main()
{
    ::test01();
    return 0;
}

运行结果图:
这里写图片描述

5.函数模板使用:

#include <iostream>
#include <string>
#include <vector>
using std::vector;
using std::string;
using std::cin;
using std::cout;
using std::endl;
template<typename T>
void check_and_print(const vector<T>& vec)
{

    cout << "size: " << vec.size() << "  content: [";
    for (auto it = vec.begin(); it != vec.end(); ++it)
        cout << *it << ",";
    if(vec.size())
        cout<<"\b";
    cout << "]\n" << endl;
}
void test01()
{
    vector<int> v1;
    vector<int> v2(10);
    vector<int> v3(10, 42);
    vector<int> v4{ 10 };
    vector<int> v5{ 10, 42 };
    vector<string> v6{ 10 };
    vector<string> v7{ 10, "hi" };

    check_and_print(v1);
    check_and_print(v2);
    check_and_print(v3);
    check_and_print(v4);
    check_and_print(v5);
    check_and_print(v6);
    check_and_print(v7);
}

int main()
{
    ::test01();
    return 0;
}

运行结果图:
这里写图片描述

6.函数模板与普通函数一起使用

#include <iostream>
#include <string>
#include <vector>
using std::vector;
using std::string;
using std::cin;
using std::cout;
using std::endl;

void check_and_print(const vector<int>& vec)
{
    cout << "size: " << vec.size() << "  content: [";
    for (auto it = vec.begin(); it != vec.end(); ++it)
        cout << *it << ",";
    if(vec.size()!=0)
        cout<<"\b";
    cout << "]\n" << endl;
}
void check_and_print(const vector<string>& vec)
{

    cout << "size: " << vec.size() << "  content: [";
    for (auto it = vec.begin(); it != vec.end(); ++it)
        cout << *it << ",";
    if(vec.size()!=0)
        cout<<"\b";
    cout << "]\n" << endl;
}
template<typename T>
void check_and_print(const vector<T>& vec)
{

    cout << "size: " << vec.size() << "  content: [";
    for (auto it = vec.begin(); it != vec.end(); ++it)
        cout << *it << ",";
    if(vec.size())
        cout<<"\b";
    cout << "]\n" << endl;
}
void test01()
{
    vector<int> v1;
    vector<int> v2(10);
    vector<int> v3(10, 42);
    vector<int> v4{ 10 };
    vector<int> v5{ 10, 42 };
    vector<string> v6{ 10 };
    vector<string> v7{ 10, "hi" };
    vector<double> doubeVec(5,2.3);

    check_and_print(v1);
    check_and_print(v2);
    check_and_print(v3);
    check_and_print(v4);
    check_and_print(v5);
    check_and_print(v6);
    check_and_print(v7);
    check_and_print(doubeVec);
}

int main()
{
    ::test01();
    return 0;
}

在普通函数与函数模板一起使用的情况下,到底是使用普通实例函数还是函数模板?结果是编译器优先使用对应的普通函数,调用普通函数的优先级高于函数模板。在debug模式下,调试可以看出,调用的是普通函数,在普通函数中找不到对应的类型的时候,才调用函数模板。
下图是调用普通函数的截图
这里写图片描述

下图是调用函数模板的截图
这里写图片描述

  • 1
    点赞
  • 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、付费专栏及课程。

余额充值