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模式下,调试可以看出,调用的是普通函数,在普通函数中找不到对应的类型的时候,才调用函数模板。
下图是调用普通函数的截图
这里写图片描述

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

猜你喜欢

转载自blog.csdn.net/zqw_yaomin/article/details/81287171