日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

c++模板--2(模板机制,模板的局限性,类模板,类模板做函数的参数)

發(fā)布時(shí)間:2023/11/30 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++模板--2(模板机制,模板的局限性,类模板,类模板做函数的参数) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

函數(shù)模板機(jī)制結(jié)論

  • 編譯器并不是把函數(shù)模板處理成能狗處理任何類(lèi)型的函數(shù)
  • 函數(shù)模板通過(guò)具體類(lèi)型產(chǎn)生不同的函數(shù)
  • 編譯器會(huì)對(duì)函數(shù)模板進(jìn)行兩次編譯,在聲明的地方對(duì)模板代碼的本身進(jìn)行編譯,在調(diào)用的地方對(duì)參數(shù)替換后代碼進(jìn)行編譯
  • 在編譯器編譯階段,對(duì)于模板函數(shù)的使用,編譯器需要根據(jù)傳入的實(shí)參類(lèi)型來(lái)推演生成對(duì)應(yīng)類(lèi)型的函數(shù)以供 調(diào)用。比如:當(dāng)用double類(lèi)型使用函數(shù)模板時(shí),編譯器通過(guò)對(duì)實(shí)參類(lèi)型的推演,將T確定為double類(lèi)型,然 后產(chǎn)生一份專(zhuān)門(mén)處理double類(lèi)型的代碼,對(duì)于字符類(lèi)型也是如此。
  • 模板的局限性

  • 模板不能解決所有類(lèi)型

  • 如果出現(xiàn)不能解決的類(lèi)型,可以通過(guò)第三具體化來(lái)解決問(wèn)題

  • template<>返回值 函數(shù)名 <具體類(lèi)型>(參數(shù))

    #include<iostream>using namespace std;class Person{public:Person(string name, int age){this->m_Name = name;this->m_Age = age;}string m_Name;int m_Age;};template<class T>bool myCompare(T &a, T&b){if (a == b){return true;}return false;}//通過(guò)具體化自定義數(shù)據(jù)類(lèi)型,解決上述問(wèn)題//如果具體化能夠優(yōu)先匹配,那么就選擇具體化//語(yǔ)法 template<>返回值 函數(shù)名<具體類(lèi)型>(參數(shù))template<> bool myCompare<Person>(Person &a, Person&b){if (a.m_Age == b.m_Age){return true;}return false;}void test01(){int a = 10;int b = 20;int ret = myCompare(a, b);cout << "ret=" << ret << endl;Person p1("Tom", 10);Person p2("Jerry", 10);int ret2 = myCompare(p1, p2);cout << "ret2=" << ret2 << endl;}int main(){test01();system("pause");return 0;}
  • 類(lèi)模板

  • 與函數(shù)模板區(qū)別,可以有默認(rèn)類(lèi)型參數(shù)

  • 函數(shù)模板可以進(jìn)行自動(dòng)類(lèi)型推導(dǎo),而類(lèi)模板不行

  • 成員函數(shù) 一開(kāi)始不會(huì)創(chuàng)建出來(lái),而是在運(yùn)行時(shí)才去創(chuàng)建

    #include<iostream>#include<string>using namespace std;template<class NameType,class AgeType=int>//類(lèi)模板可以有默認(rèn)的參數(shù)class Person{public:Person(NameType name, AgeType age){this->m_Name = name;this->m_Age = age;}void showPerson(){cout << "姓名:" << this->m_Name << "年齡:" << this->m_Age << endl;}NameType m_Name;AgeType m_Age;};void test01(){//自動(dòng)類(lèi)型推導(dǎo),類(lèi)模板 不支持//Person p("孫悟空", 100);//顯示指定類(lèi)型Person<string, int>p("孫悟空", 100);p.showPerson();}class Person1{public:void showPerson1(){cout << "Person1的調(diào)用" << endl;}};class Person2{public:void showPerson2(){cout << "Person2的調(diào)用" << endl;}};template<class T>class myClass{public:T obj;void func1(){obj.showPerson1();}void func2(){obj.showPerson2();}};//成員函數(shù) 一開(kāi)始不會(huì)創(chuàng)建出來(lái),而是在運(yùn)行時(shí)才去創(chuàng)建void test02(){myClass<Person1>m;m.func1();m.func2();}int main(){//test01();test02();system("pause");return 0;}
  • 類(lèi)模板做函數(shù)的參數(shù)

  • 顯示的指定類(lèi)型

  • 參數(shù)模板化

  • 整體模板化

  • 查看類(lèi)型名稱(chēng)cout << typeid(T1).name() << endl;

    #include<iostream>#include<string>using namespace std;template<class NameType, class AgeType = int>//類(lèi)模板可以有默認(rèn)的參數(shù)class Person{public:Person(NameType name, AgeType age){this->m_Name = name;this->m_Age = age;}void showPerson(){cout << "姓名:" << this->m_Name << "年齡:" << this->m_Age << endl;}NameType m_Name;AgeType m_Age;};//1. 指定傳入類(lèi)型void doWork(Person<string, int>&p){p.showPerson();}void test01(){Person<string, int >p("MT", 10);doWork(p);}//2.參數(shù)模板化template<class T1,class T2>void doWork2(Person<T1, T2>&p){//如何查看類(lèi)型cout << typeid(T1).name() << endl;cout << typeid(T2).name ()<< endl;p.showPerson();}void test02(){Person<string, int>p("呆賊", 18);doWork2(p);}//3 整體模板化template<class T>void doWork3(T &p){cout << typeid(T).name() << endl;p.showPerson();}void test03(){Person<string, int>p("掠人", 18);doWork3(p);}int main(){//test01();test02();test03();system("pause");return 0;}
  • 總結(jié)

    以上是生活随笔為你收集整理的c++模板--2(模板机制,模板的局限性,类模板,类模板做函数的参数)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。