日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ Primer 5th笔记(chap 16 模板和泛型编程)模板实参推断

發布時間:2025/3/21 c/c++ 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ Primer 5th笔记(chap 16 模板和泛型编程)模板实参推断 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 模板實參推斷( template argument deduction)

在模板實參推斷過程中, 編譯器使用函數調用中的實參類型來尋找模板實參, 用這些模板實參生成的函數版本與給定的函數調用最為匹配。

1.1 實參類型轉換

如果一個函數形參的類型使用了模板類型參數, 那么它采用特殊的初始化規則。 類型轉換:

  • const轉換。可以將一個非const對象的指針或者引用傳遞給一個const指針或者引用形參。
  • 數組或函數指針轉換,如果函數形參不是引用類型,則可以對數組或者函數類型的實參應用正常的指針轉換

但是

  • 編譯器通常不是對實參進行類型轉換,而是生成一個新的模板實例。
  • 其他的類型轉換,如算術轉換,派生類向基類的轉換,以及用戶自定義的轉換,都不能應用于函數模板的實參。
template <typename T> T fobj(T, T);//實參是被拷貝 template <typename T> T fref(const T &, const T &);//引用string s1("a value"); const string s2("another value"); fobl(s1, s2);//調用fobj(string ,string);忽略頂層constfref(s1, s2);//調用的是,fref(const string &, const string &), s1轉換為const是允許的。int a[10], b[30]; fobj(a, b);//調用的是,fobj(int *, int *) fref(a, b);//錯誤,數組的類型不一致。

1.2 使用相同模板參數類型的函數形參

一個模板類型參數可以用作多個函數形參的類型。 由于只允許有限的幾種類型轉換,因此傳遞給這些形參的實參必須具有相同的類型。 如果推斷出的類型不匹配, 則調用就是錯誤的。

eg, compare 函數接受兩個 const T &參數, 其實參必須是相同類型: long lng; compare (lng, 1024 ); / / 錯誤: 不能實例化 compare (long, int )
  • 解決方法:將函數模板定義為兩個類型參數:
//實參類型可以不同, 但必須兼容 template ctypename A, typename B> int flexibleCompare (const A& vl, const B& v2){if (vl < v2) return -1;if (v2 < vl) return 1/return 0; } long lng; flexibleCompare (lng, 1024 ); / / 正確: 調用 flexibleCompare (long, int )

1.3 正常類型轉換應用于普通函數實參

函數模板可以有用普通類型定義的參數, 即, 不涉及模板類型參數的類型。 這種函數實參不進行特殊處理; 它們正常轉換為對應形參的類型。

eg.

template <typename T> ostream Sprint (ostream &os, const T &obj ) {return os ? obj; }print (cout, 42 ); // 實例化 print (ostream&, int ) ofstream f ("output" ); print (f, 10); // 使用 print (ostream&, int ) ; 將 f 轉換為 ostream&

總結

以上是生活随笔為你收集整理的C++ Primer 5th笔记(chap 16 模板和泛型编程)模板实参推断的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。