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; }
作者:水水滴答
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。