精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C++函數模板詳解,輕松實現通用函數

開發 前端
理論上,C++ 語言允許您編寫函數模板特化,就像您可以編寫類模板特化一樣。但這樣的函數模板特化不參與重載解析,因此可能表現出意外的行為。相反,您可以用非模板函數重載函數模板。

一、函數模板

1.編寫通用函數

您也可以為獨立的函數編寫模板。其語法與類模板類似。例如,您可以編寫以下通用函數來在數組中查找一個值并返回其索引:

static const size_t NOT_FOUND { static_cast<size_t>(-1) };

template <typename T>
size_t Find(const T& value, const T* arr, size_t size) {
    for (size_t i { 0 }; i < size; i++) {
        if (arr[i] == value) {
            return i; // 找到了; 返回索引。
        }
    }
    return NOT_FOUND; // 沒找到; 返回 NOT_FOUND。
}

注意:當然,當元素未找到時,您可以不返回某種哨兵值(如 NOT_FOUND),而是改寫此代碼以返回 std::optional<size_t> 而不是 size_t。這將是使用 optional 的有趣練習。

2.Find() 函數模板的應用

Find() 函數模板可以在任何類型的數組上工作。例如,您可以用它來在 int 數組中查找 int 的索引,或者在 SpreadsheetCell 數組中查找 SpreadsheetCell。您可以通過兩種方式調用該函數:顯式地用尖括號指定類型參數,或者省略類型并讓編譯器從參數中推斷出類型參數。以下是一些示例:

int myInt { 3 }, intArray[] {1, 2, 3, 4};
const size_t sizeIntArray { size(intArray) };
size_t res;

// 通過推斷調用 Find<int>。
res = Find(myInt, intArray, sizeIntArray);

// 顯式地調用 Find<int>。
res = Find<int>(myInt, intArray, sizeIntArray);

// 其他示例
double myDouble { 5.6 }, doubleArray[] {1.2, 3.4, 5.7, 7.5};
const size_t sizeDoubleArray { size(doubleArray) };

// 通過推斷調用 Find<double>。
res = Find(myDouble, doubleArray, sizeDoubleArray);

// 顯式地調用 Find<double>。
res = Find<double>(myDouble, doubleArray, sizeDoubleArray);

SpreadsheetCell cell1 { 10 }
SpreadsheetCell cellArray[] { SpreadsheetCell { 4 }, SpreadsheetCell { 10 } };
const size_t sizeCellArray { size(cellArray) };
res = Find(cell1, cellArray, sizeCellArray);
res = Find<SpreadsheetCell>(cell1, cellArray, sizeCellArray);

3.數組大小的自動推斷

之前的 Find() 函數實現需要作為參數之一的數組大小。有時編譯器知道數組的確切大小,例如,對于基于堆棧的數組。能夠在不需要傳遞數組大小的情況下調用 Find() 會很方便。這可以通過添加以下函數模板來實現。實現只是將調用轉發到之前的 Find() 函數模板。這也表明,函數模板可以像類模板一樣接受非類型參數。

template <typename T, size_t N>
size_t Find(const T& value, const T(&arr)[N]) {
    return Find(value, arr, N);
}

這個版本的 Find() 語法看起來有點奇怪,但其使用非常直接,如下例所示:

int myInt { 3 }, intArray[] {1, 2, 3, 4};
size_t res { Find(myInt, intArray) };

4.函數模板的定義和導出

與類模板方法定義一樣,函數模板的定義(不僅僅是原型)必須對使用它們的所有源文件可用。因此,如果多個源文件使用它們,您應該將定義放在模

塊接口文件中并導出它們。

最后,函數模板的模板參數可以像類模板一樣有默認值。

注意:C++ 標準庫提供了一個比這里展示的 Find() 函數模板更強大的 std::find() 函數模板。

二、函數模板重載

1.函數模板與特化

理論上,C++ 語言允許您編寫函數模板特化,就像您可以編寫類模板特化一樣。然而,您很少需要這樣做,因為這樣的函數模板特化不參與重載解析,因此可能表現出意外的行為。相反,您可以用非模板函數重載函數模板。例如,您可能想為 const char* 類型的 C 風格字符串編寫一個 Find() 重載,這個重載使用 strcmp()來比較,而不是用 operator==,因為 == 只會比較指針,而不是實際的字符串。以下是這樣的重載:

size_t Find(const char* value, const char** arr, size_t size) {
    for (size_t i { 0 }; i < size; i++) {
        if (strcmp(arr[i], value) == 0) {
            return i; // 找到了; 返回索引。
        }
    }
    return NOT_FOUND; // 沒找到; 返回 NOT_FOUND。
}

這個函數重載的使用方式如下:

const char* word { "two" };
const char* words[] { "one", "two", "three", "four" };
const size_t sizeWords { size(words) };
size_t res { Find(word, words, sizeWords) }; // 調用非模板函數。

如果您顯式指定模板類型參數,如下所示,那么將調用函數模板,其中 T=const char,而不是 const char

res = Find<const char*>(word, words, sizeWords);

2.重載與特化的選擇

在選擇重載函數模板時,應該考慮到函數模板特化可能不參與重載解析的規則。通常,重載函數模板與非模板函數是一種更安全且可預測的方法,特別是當涉及到特定類型的特定處理,如在處理 C 風格字符串時使用 strcmp() 而不是默認的等號運算符。

三、類模板的友元函數模板

1.重載運算符的函數模板

當您想在類模板中重載運算符時,函數模板非常有用。例如,您可能想為 Grid 類模板重載加法運算符(operator+),以便將兩個網格相加。結果將是一個與兩個操作數中較小的 Grid 同等大小的 Grid。僅當兩個單元格都包含實際值時,才會相加對應的單元格。假設您想讓您的 operator+ 成為一個獨立的函數模板。定義應該放在 Grid.cppm 模塊接口文件中,如下所示。該實現使用 <algorithm> 中定義的 std::min() 來返回兩個給定參數的最小值:

export template <typename T>
Grid<T> operator+(const Grid<T>& lhs, const Grid<T>& rhs) {
    size_t minWidth { std::min(lhs.getWidth(), rhs.getWidth()) };
    size_t minHeight { std::min(lhs.getHeight(), rhs.getHeight()) };
    Grid<T> result { minWidth, minHeight };
    
    for (size_t y { 0 }; y < minHeight; ++y) {
        for (size_t x { 0 }; x < minWidth; ++x) {
            const auto& leftElement { lhs.m_cells[x][y] };
            const auto& rightElement { rhs.m_cells[x][y] };
            if (leftElement.has_value() && rightElement.has_value()) {
                result.at(x, y) = leftElement.value() + rightElement.value();
            }
        }
    }
    return result;
}

要查詢一個 optional 是否包含實際值,您使用 has_value() 方法,而 value() 用于檢索這個值。這個函數模板適用于任何 Grid,只要網格中存儲的元素類型有加法運算符。這個實現的唯一問題是它訪問了 Grid 類的私有成員 m_cells。一個顯而易見的解決方案是使用公共 at() 方法,但讓我們看看如何讓函數模板成為類模板的友元。

2.使函數模板成為類模板的友元

在此示例中,您可以使運算符成為 Grid 類的友元。然而,Grid 類和 operator+ 都是模板。您真正想要的是,對于特定類型 T 的每個 operator+ 實例化,都是同一類型的 Grid 模板實例化的友元。語法如下:

// 前向聲明 Grid 模板。
export template <typename T>
class Grid;

// templatized operator+ 的原型。
export template <typename T>
Grid<T> operator+(const Grid<T>& lhs, const Grid<T>& rhs);

export template <typename T>
class Grid {
public:
    friend Grid operator+<T>(const Grid& lhs, const Grid& rhs);
    // 省略其他內容
};

這種友元聲明很微妙:您在說,對于類型 T 的模板實例,operator+ 的 T 實例化是一個友元。換句話說,類實例化和函數實例化之間存在一對一的友元映射。特別注意 operator+ 上的顯式模板規范 <T>。這個語法告訴編譯器 operator+ 本身是一個模板。

3.模板參數推斷

編譯器根據傳遞給函數模板的參數推斷函數模板參數的類型。無法推斷的模板參數必須明確指定。例如,以下 add() 函數模板需要三個模板參數:返回值的類型和兩個操作數的類型:

template <typename RetType, typename T1

, typename T2>
RetType add(const T1& t1, const T2& t2) {
    return t1 + t2;
}

您可以通過以下方式調用此函數模板,明確指定所有三個參數:

auto result { add<long long, int, int>(1, 2) };

然而,因為模板參數 T1 和 T2 是函數的參數,編譯器可以推斷這兩個參數,所以您可以只指定返回值類型來調用 add():

auto result { add<long long>(1, 2) };

這只有在要推斷的參數位于參數列表的最后時才有效。假設函數模板如下定義:

template <typename T1, typename RetType, typename T2>
RetType add(const T1& t1, const T2& t2) {
    return t1 + t2;
}

您必須指定 RetType,因為編譯器無法推斷該類型。然而,由于 RetType 是第二個參數,您也必須顯式指定 T1:

auto result { add<int, long long>(1, 2) };

您還可以為返回類型模板參數提供默認值,以便在不指定任何類型的情況下調用 add():

template <typename RetType = long long, typename T1, typename T2>
RetType add(const T1& t1, const T2& t2) {
    return t1 + t2;
}
...
auto result { add(1, 2) };
責任編輯:趙寧寧 來源: coding日記
相關推薦

2023-12-13 10:51:49

C++函數模板編程

2010-02-05 17:34:37

C++函數模板

2024-01-17 23:10:59

C++函數模板開發

2010-02-04 14:22:25

C++函數模板非類型參

2010-02-02 15:59:32

C++賦值函數

2010-02-02 18:01:47

C++字符串替換函數

2010-02-03 15:52:55

C++ clock()

2010-02-04 09:26:23

C++模板函數重載

2024-04-01 09:13:20

C++函數遞增

2011-08-22 17:25:31

LuaC++函數

2010-01-18 17:38:54

C++虛函數表

2010-02-05 15:59:26

C++函數重載

2011-08-22 17:13:00

LuaC++函數

2010-02-01 13:26:58

C++讀取CSV文件

2010-02-02 09:49:02

C++模板

2010-01-28 13:35:41

調用C++函數

2009-09-10 16:30:11

C#排序函數

2010-01-18 16:56:30

C++函數

2010-01-26 10:42:26

C++函數

2024-12-17 12:00:00

C++對象模型
點贊
收藏

51CTO技術棧公眾號

国产一级爱c视频| 成人福利在线视频| 国产 欧美 在线| 青青伊人久久| 亚洲午夜电影在线| 日韩精品久久久毛片一区二区| 中文字幕日韩经典| 精品999日本| 在线视频日韩精品| 99re这里只有| 伊人久久大香伊蕉在人线观看热v| 亚洲一区中文日韩| 亚洲一区二区三区涩| 免费看国产片在线观看| 久久国产精品露脸对白| 2019中文字幕在线观看| 日本一级二级视频| 精品国精品国产自在久国产应用| 欧美tk—视频vk| 久久婷婷综合色| 亚洲日本天堂| 午夜国产精品一区| 久久久久亚洲av无码专区喷水| 蜜桃视频在线播放| 懂色av中文字幕一区二区三区| 国产精品久久久久久久久久免费| 男人的天堂一区| 中文字幕人成人乱码| 中文字幕一区二区三区电影| 99久久人妻无码中文字幕系列| 日韩精品一区二区三区中文在线| 在线看一区二区| 777久久久精品一区二区三区| 欧美v亚洲v| 中文字幕亚洲欧美在线不卡| 日韩啊v在线| 男男激情在线| 91网站黄www| 粉嫩高清一区二区三区精品视频 | 亚洲国产人成综合网站| 裸体大乳女做爰69| 日本a级在线| 国产精品网站一区| 色噜噜狠狠色综合网| 日本福利片在线| 91免费看视频| 欧美日韩国产高清视频| 婷婷丁香一区二区三区| 不卡一卡二卡三乱码免费网站| 91九色在线免费视频| 国产亲伦免费视频播放| 极品少妇一区二区三区精品视频| 国产精品日韩一区| 亚洲自拍偷拍另类| 久久99精品久久久久久久久久久久 | 麻豆精品网站| 456亚洲影院| 久久久久亚洲av成人毛片韩| 亚洲欧美日本视频在线观看| 欧美亚洲国产视频小说| 免费黄色网址在线| 久久青草久久| 国产精品网红直播| av中文字幕免费| 国产电影一区二区三区| 国产精品二区在线观看| 四虎精品一区二区三区| 91免费视频网| 亚洲狠狠婷婷综合久久久| 在线免费黄色| 一区二区三区精密机械公司| 麻豆tv在线播放| 精品国产免费人成网站| 欧美一a一片一级一片| av噜噜在线观看| 日韩中文字幕无砖| 亚洲精品第一页| x88av在线| 91精品国产麻豆国产在线观看| 久久国产精品影片| 国产一级久久久| 久久亚洲风情| 成人免费在线视频网站| 色丁香婷婷综合久久| 久久精品一区二区三区av| 一区一区视频| 51漫画成人app入口| 色噜噜狠狠成人中文综合| 亚洲一二三不卡| 欧美黄色影院| 久久精品视频在线观看| 在线观看 中文字幕| 免费久久99精品国产| 俄罗斯精品一区二区| 国产三级视频在线播放线观看| 自拍偷在线精品自拍偷无码专区| 日韩黄色片在线| 人人鲁人人莫人人爱精品| 欧美一区二区三区白人| 亚洲黄色在线网站| 在线一区电影| 国产成人精品电影久久久| 国产哺乳奶水91在线播放| 久久先锋影音av鲁色资源网| 看一级黄色录像| 日韩pacopacomama| 精品电影一区二区三区| 午夜激情视频在线播放| 国产精品主播| 亚洲iv一区二区三区| 精品视频一二三| 亚洲综合在线视频| 亚洲精品成人在线播放| 蜜臀久久99精品久久一区二区 | 91视频最新网址| 99精品热6080yy久久| 亚洲aaaaaa| 成人在线免费视频| 欧美色道久久88综合亚洲精品| 特黄特黄一级片| 日韩欧美高清在线播放| 日韩av三级在线观看| 欧美一区二区公司| 亚洲免费伊人电影| 久久久久久久久久一区| 欧美日韩中文一区二区| 欧美亚洲成人免费| 少妇高潮一区二区三区99小说| 亚洲欧美日韩在线不卡| 日本久久精品一区二区| 国产不卡一二三区| 欧美专区福利在线| 日韩av地址| 欧美日韩精品在线观看| av无码一区二区三区| 狠狠久久婷婷| 岛国视频一区免费观看| 在线观看午夜av| 日韩精品最新网址| 麻豆亚洲av熟女国产一区二| 国产美女在线观看一区| 中文字幕黄色大片| a一区二区三区亚洲| 中文字幕日韩视频| 一区精品在线观看| 国产精品麻豆欧美日韩ww| 亚洲综合日韩欧美| 久久视频在线| 亚洲jizzjizz日本少妇| 在线中文字幕-区二区三区四区| 宅男噜噜噜66一区二区66| 永久免费看mv网站入口| 国产一区二区三区精品视频| 日本xxx免费| 日本成人精品| 久久久久久久久综合| 日本黄色大片视频| 欧美日韩在线视频首页| 成人乱码一区二区三区av| 久久综合激情| 亚洲精品视频一二三| 亚洲精品一区av| 精品中文字幕在线2019| 肥臀熟女一区二区三区| 精品久久久久久亚洲精品| 双性尿奴穿贞c带憋尿| 可以看av的网站久久看| 亚洲欧美日产图| 欧美午夜在线播放| 91国产一区在线| 国产最新视频在线| 7777精品伊人久久久大香线蕉最新版| 日韩欧美综合视频| av在线播放一区二区三区| 青青草原av在线播放| 日韩片欧美片| 国产精品国产一区二区| 一个人看的www视频在线免费观看 一个人www视频在线免费观看 | 天天操天天舔天天干| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 久久久精品在线视频| 日韩三级在线| 成人黄动漫网站免费| av毛片午夜不卡高**水| 伊人激情综合网| 好吊色视频一区二区| 日韩欧美国产骚| 国产一区二区视频在线观看免费| 丁香五精品蜜臀久久久久99网站| 精品国产成人av在线免| 婷婷精品进入| 欧美12av| 网站一区二区| 国产精品老牛影院在线观看| 五月花成人网| 伊人伊人伊人久久| 亚洲国产精品久久久久久久| 91国内精品野花午夜精品| 久草视频中文在线| 国产精品免费视频观看| 国产精品一级黄片| 国产伦精品一区二区三区在线观看 | 八戒八戒神马在线电影| 日韩电视剧免费观看网站| 一区二区三区黄| 色综合久久中文字幕综合网| 免费在线观看黄色av| 中文无字幕一区二区三区| 欧产日产国产精品98| 国产一区二区精品久久91| 欧美一级片中文字幕| 亚洲第一黄色| 2022中文字幕| 51精产品一区一区三区| 日本在线视频一区| 日韩欧美影院| 国产九色精品| 亚洲精品一二三**| 亚洲一区久久久| www.一区| 国产精品久久久久久久久久三级| caoporn视频在线观看| 米奇精品一区二区三区在线观看| yw在线观看| 亚洲天堂男人天堂| 四虎影院在线域名免费观看| 亚洲福利视频网站| 亚洲精品18p| 日韩免费电影网站| 国产美女主播在线观看| 欧美巨大另类极品videosbest | 亚洲免费精彩视频| 亚洲av片一区二区三区| 亚洲成人网在线| www.欧美国产| 欧美成人猛片aaaaaaa| 国产人妖一区二区| 51午夜精品国产| 国产一区二区三区四区视频 | 欧美专区日韩视频| 最近高清中文在线字幕在线观看1| 欧美精品videosex极品1| 日韩av毛片| 欧美精品久久久久久久久| 日本三级在线观看网站| 九九久久精品一区| 青草在线视频| 国内伊人久久久久久网站视频| 精灵使的剑舞无删减版在线观看| 欧美国产日韩一区二区| 丁香高清在线观看完整电影视频| 久久成人精品视频| 日本在线观看高清完整版| 欧美激情图片区| а√在线中文在线新版| 欧美亚洲激情视频| 国产综合av| 国产欧美婷婷中文| 久久在线观看| 国产另类自拍| 国产91精品对白在线播放| 亚洲7777| 最新精品国产| 成人一区二区免费视频| 老鸭窝91久久精品色噜噜导演| 国产精品免费成人| 老司机午夜精品| 潘金莲一级淫片aaaaa| 成人av网在线| a级片在线观看| 亚洲图片激情小说| 久久久久久激情| 日韩人体视频一二区| 在线观看中文字幕码| 91精品国产高清一区二区三区蜜臀| 亚洲国产精品国自产拍久久| 精品伊人久久97| 美女免费久久| 97成人超碰免| 日韩一级特黄| 国产一区免费视频| 成人情趣视频网站| 亚洲精品国产suv一区88| 亚洲制服少妇| 亚洲天堂伊人网| 91论坛在线播放| 暗呦丨小u女国产精品| 欧美日韩国产精品专区| 一级做a爰片久久毛片16| 亚洲国产美女久久久久| avav免费在线观看| 午夜精品在线观看| 99久久久成人国产精品| 久久国产精品亚洲va麻豆| 久久中文亚洲字幕| 日本一区二区黄色| 国产乱码精品一品二品| 国精产品一区一区三区免费视频| 亚洲图片欧美激情| 午夜视频网站在线观看| 欧美成人猛片aaaaaaa| 午夜视频在线观看免费视频| 国内精品视频久久| 国产视频一区二区在线播放| 欧美一级日本a级v片| 亚洲一级一区| 欧美日韩久久婷婷| 中文字幕久久午夜不卡| av大片免费在线观看| 欧美一区二区在线播放| 成人在线免费视频| 欧洲s码亚洲m码精品一区| 在线观看视频一区二区三区| 亚洲一区二区三区精品视频| 性色一区二区三区| 午夜剧场免费看| 一区二区三区中文免费| 一级片视频播放| 亚洲天堂免费在线| 成人教育av| 久久精品美女| 99综合视频| 欧美一区二区免费在线观看| 樱桃国产成人精品视频| 国产精品一区二区黑人巨大| 中文字幕欧美视频在线| 美女福利一区二区三区| 精品免费国产| 亚洲激情不卡| 亚洲欧美高清在线| 一个色在线综合| 99久久免费国产精精品| 久久成人精品电影| 韩国三级大全久久网站| 自拍偷拍99| 极品少妇一区二区三区精品视频| 一级特黄曰皮片视频| 在线观看网站黄不卡| 久久久久久青草| 69视频在线免费观看| 精品网站aaa| 你懂的av在线| aaa欧美日韩| 色婷婷av国产精品| 精品五月天久久| 午夜日韩成人影院| 欧美一区二区三区四区五区六区| 一区二区久久| 无码一区二区三区在线| 欧美色图一区二区三区| 中国日本在线视频中文字幕| 成人国产在线视频| 婷婷精品进入| 男人添女人荫蒂国产| 亚洲一区二区欧美日韩| 五月天久久久久久| 日韩69视频在线观看| 俺要去色综合狠狠| 亚洲综合激情视频| 亚洲制服丝袜av| 天堂中文在线资| 国产精品福利在线观看网址| 日韩欧美三级| 男人的天堂免费| 欧美日韩国产综合新一区| 国内三级在线观看| 成人福利免费观看| 国模吧视频一区| 久操视频免费看| 7777精品伊人久久久大香线蕉完整版| 色婷婷av在线| 欧美1o一11sex性hdhd| 日本强好片久久久久久aaa| 日本一二三区在线观看| 精品国产免费一区二区三区香蕉| 欧美伦理91| 中文字幕一区二区三区四区五区| 国产成人在线视频网址| 一级成人黄色片| 久久天天躁日日躁| 免费萌白酱国产一区二区三区| 999精品视频在线| 亚洲综合久久av| www.视频在线.com| av日韩免费电影| 日韩国产高清在线| 青娱乐免费在线视频| 亚洲色图偷窥自拍| 久久久久久久久成人| 男人亚洲天堂网| 夜夜嗨av一区二区三区网页| 美女毛片在线看| 99re6热在线精品视频播放速度| 久久亚洲影院| 久久网免费视频| 中日韩美女免费视频网址在线观看| 午夜日韩影院| 成 人 黄 色 小说网站 s色| 亚洲成人福利片| 国产在线观看免费麻豆|