c++笔记——函数模板

模板函数的几种常见写法

 几个要点

(1)设置了几个模板类型,就要在函数参数里面至少用一次

(2)函数模板类型名称和其他类型不可重名

(3)函数模板类型不支持隐式类型转换,除非显式类型名称

(4)模板函数和普通函数重载,优先匹配到普通函数

//
// Created by ht on 2023/4/16.
//

#ifndef TEST_THREAD_TEST_H
#define TEST_THREAD_TEST_H

#include <iostream>
#include <string>
#include<typeinfo>
#include<cxxabi.h>
#include <vector>
#include <cstring>

using namespace std;


template <typename T>
T add(T a, T b){
    return a + b;
}


template <typename A, typename B>
void sizeOfType(A a, B b){
    cout << abi::__cxa_demangle(typeid(a).name(),0,0,0 ) << endl;
    cout << abi::__cxa_demangle(typeid(b).name(),0,0,0 ) << endl;
}

//设置了几个模板参数,就要在函数参数里面至少用一次
template<typename M, typename N>
void fun(M a, N b,M c)
{
    cout << "a  = " << a << endl;
    cout << "b  = " << b << endl;
}

template <typename T>
void fun2(T a, T b){
    cout << "in template fun." << endl;
}

void fun2(int a, int b){
    cout << "in common fun." << endl;
}


template<typename T>
void fun3(T t){
    // typedef float T;//报错declaration of ‘typedef float T’ shadows template parameter,模板类型和重命名float类型的名字冲突了
    typedef float F;//更改名字即可
}

//非类型模板参数:表示一个值而非一个类型
template <unsigned N, unsigned M>
int compare(const char (&p1)[N], const char (&p2)[M]){
    return strcmp(p1, p2);

}

#endif //TEST_THREAD_TEST_H

main函数

#include "test.h"
int main(){

    cout << "hello world." << endl;

    auto nums = add(2,3);
   //auto num1 = add(2.5,3);  //error: no matching function for call to ‘add(double, int)’
    auto num2 = add<double>(2.5,3);//正常,可以显式地将类型表示出来
    auto num3 = add('a', 'b');//assic
    cout << nums << endl;
    cout << "num2 = "<< num2 << endl;
    cout << "num3 = "<< num3 << endl;

    int a = 1;
    double b = 2.3;
    string str = "hello world";
    vector<int> vec(10, 0);
    sizeOfType(str, vec);

    fun(a, b, a);
    //模板函数和普通函数重载,优先匹配到普通函数
    fun2(1,1);
    fun2(1.23, 12.2);

    auto i = compare("hii", "hi");
    cout << "i = " << i << endl;

    return 0;
}

 

posted @ 2023-04-16 22:51  水水滴答  阅读(8)  评论(0编辑  收藏  举报