美文网首页
c++函数模板

c++函数模板

作者: arkliu | 来源:发表于2022-11-22 08:28 被阅读0次

    函数模板

    函数模板适用场景:

    • 函数的业务逻辑一样
    • 函数的参数类型不一样

    函数模板特性:

    • 函数模板可以被重载
    • 编译器优先匹配普通函数
    • 可以通过调用时候加<>强制调用模板函数
    #include <iostream>
    
    using namespace std;
    
    //template告诉编译器,下面是泛型编程,看到T,不要报错
    template<typename T>
    void mySwap(T& a, T&b) {
        T tmp;
        tmp = a;
        a = b;
        b = tmp;
    }
    
    int main() {
        
        // 函数模板的调用
        // 1. 显示类型调用
        {
            int x = 10;
            int y = 33;
            mySwap<int>(x, y);
            cout << "x = "<< x << "  y = "<<y << endl;
        }
        // 2. 自动类型推导
        {
            char x = 'a';
            char y = 'b';
            mySwap(x, y);
            cout << "x = "<< x << "  y = "<<y << endl;
        }
        return 0;
    }
    

    函数模板当函数参数

    #include <iostream>
    
    using namespace std;
    
    template<typename T, typename T1>
    void mySort(T * array, T1 size) {
        if (array == NULL)
        {
            return;
        }
        T tmp;
        for (size_t i = 0; i < size; i++)
        {
            for (size_t j = i+1; j < size; j++)
            {
                if (array[i] < array[j])
                {
                    tmp = array[i];
                    array[i] = array[j];
                    array[j] = tmp;
                } 
            }
        }
    }
    
    template<class T, class T1>
    void myPrint(T * array, int size) {
        for (size_t i = 0; i < size; i++)
        {
            cout << array[i] << "   ";
        }
    }    
    
    int main() {
        int int_array[] = {11,23,42,6,7,8,9};
        int size = sizeof(int_array) / sizeof(int_array[0]);
        mySort<int, int>(int_array, size);
    
        myPrint<int, int>(int_array, size);
        return 0;
    }
    

    函数模板的调用和参数推导

    #include <iostream>
    
    using namespace std;
    
    template<typename T>
    T myAdd(T a, T b) {
        return a+b;
    }
    
    int myAdd(int a, char b) {
        return a + b;
    }
    
    #if 0
    int myAdd(int a, int b) {
        return a + b;
    }
    #endif
    
    int main() {
        int a = 10;
        int b = 20;
        char c = 'a';
        char d = 'd';
    
        myAdd(a, c); // int myAdd(int a, char b)
        myAdd(a, b); // T myAdd(T a, T b)  函数模板必须严格类型匹配
        myAdd(c, b); // int myAdd(int a, char b)   普通函数可以进行自动类型转换
        // myAdd(a, b); // int myAdd(int a, char b)  编译器优先匹配普通函数
        myAdd<>(a, b); // T myAdd(T a, T b)  通过<> 强制调用模板函数
    
        return 0;
    }
    

    函数模板类型参数默认值

    template<class T1,class T2=int> // 这里表示的是类型的默认值
    void fun1(T1 a, T2 b=123) { //b参数默认值为123
    
    }
    

    函数模板特化

    template<class T1, class T2>
    void fun01(T1 a, T2 b) {
        cout <<"函数模板.."<<endl;
    }
    
    // 函数模板特化,函数名必须和函数模板相同
    template<>
    void fun01<int,double>(int a, double b) {
        cout <<"函数模板全特化..."<<endl;
    }
    // 函数模板偏特化
    template<class T1=int,class T2>
    void fun01(int a, T2 b) {
        cout <<"函数模板局部特化..."<<endl;
    }
    
    

    相关文章

      网友评论

          本文标题:c++函数模板

          本文链接:https://www.haomeiwen.com/subject/qcvnzrtx.html