成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C++函數(shù)模板:掌握返回類型推導(dǎo)的藝術(shù)

開發(fā) 前端
討論 add() 函數(shù)模板的示例,讓編譯器推導(dǎo)返回值的類型確實(shí)是個好主意。然而,返回類型依賴于模板類型參數(shù),那該如何實(shí)現(xiàn)呢?

編譯器推導(dǎo)返回類型

討論 add() 函數(shù)模板的示例,讓編譯器推導(dǎo)返回值的類型確實(shí)是個好主意。然而,返回類型依賴于模板類型參數(shù),那該如何實(shí)現(xiàn)呢?例如,考慮以下函數(shù)模板:

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

在這個示例中,RetType 應(yīng)該是表達(dá)式 t1 + t2 的類型,但你無法知道這一點(diǎn),因?yàn)槟悴恢?nbsp;T1 和 T2 是什么。

自動類型推導(dǎo)

自 C++14 起,你可以讓編譯器自動推導(dǎo)函數(shù)的返回類型。因此,你可以簡單地將 add() 寫成如下:

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

在 C++ 中,當(dāng)使用 auto 關(guān)鍵字來推導(dǎo)函數(shù)返回值的類型時,它會自動去除表達(dá)式中的引用(reference)和 const 限定符。這意味著,如果函數(shù)的返回類型原本是一個引用或 const 類型,使用 auto 推導(dǎo)后,返回值將會失去這些屬性。例如,如果原本返回的是一個 const 引用,使用 auto 推導(dǎo)后,返回值將僅是一個值,而非引用,并且也不再是 const 類型。

對于某些函數(shù)來說,這種去除引用和 const 的行為是可以接受的。例如,在 add() 函數(shù)模板中,如果使用 auto,這通常沒問題,因?yàn)?nbsp;operator+(加法運(yùn)算符)一般返回一個新的對象,而不是引用或 const 對象。

然而,在其他一些情況下,可能需要保留函數(shù)返回值的原始屬性,比如其為引用或 const 類型。在這些情況下,簡單地使用 auto 來推導(dǎo)返回類型可能就不夠理想了。因此,需要使用其他方法(使用 decltype(auto) 的函數(shù)模板)來確保函數(shù)返回值的原始屬性被正確保留。

auto 與 decltype 的區(qū)別

考慮以下非模板示例,了解 auto 和 decltype 之間的差異:

const std::string message { "Test" };
const std::string& getString() { return message; }

auto s1 { getString() }; // s1 是 string 類型,進(jìn)行了拷貝
const auto& s2 { getString() }; // s2 是對常量的引用
decltype(getString()) s3 { getString() }; // s3 是 const string& 類型
decltype(auto) s4 { getString() }; // s4 也是 const string& 類型

使用 decltype(auto) 的函數(shù)模板

有了這些知識,我們可以使用 decltype(auto) 來編寫我們的 add() 函數(shù)模板,以避免去除任何 const 和引用限定符:

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

C++14 之前的方法

在 C++14 之前,也就是在函數(shù)返回類型推導(dǎo)和 decltype(auto) 得到支持之前,問題是通過使用 decltype(expression) 來解決的,這是 C++11 引入的。例如,你可能會寫出以下代碼:

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

然而,這是錯誤的。你在原型行的開頭使用了 t1 和 t2,但這些參數(shù)還未知。t1 和 t2 在到達(dá)參數(shù)列表末尾時才變得已知。

這個問題曾經(jīng)通過替代函數(shù)語法解決。注意,在這種語法中,auto 用于原型行的開頭,而實(shí)際的返回類型在參數(shù)列表之后指定(尾隨返回類型);因此,參數(shù)的

名稱(以及它們的類型,從而 t1 + t2 的類型)是已知的:

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

注意:現(xiàn)在 C++ 支持 auto 返回類型推導(dǎo)和 decltype(auto),建議使用這些機(jī)制,而不是替代函數(shù)語法。

C++20 的新特性

C++20 引入了一種簡化的函數(shù)模板語法。再次回顧前面的 add() 函數(shù)模板。這里是推薦的版本:

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

看這個示例,為了指定一個簡單的函數(shù)模板,語法顯得相當(dāng)冗長。使用簡化的函數(shù)模板語法,可以更優(yōu)雅地寫成如下:

decltype(auto) add(const auto& t1, const auto& t2) {
    return t1 + t2;
}

使用這種語法,不再需要 template<> 規(guī)范來指定模板參數(shù)。相反,以前在實(shí)現(xiàn)中使用的 T1 和 T2 類型現(xiàn)在被指定為 auto。這種簡化的語法只是語法糖;編譯器會自動將這種簡化實(shí)現(xiàn)轉(zhuǎn)換為更長的原始代碼。基本上,每個被指定為 auto 的函數(shù)參數(shù)都成為一個模板類型參數(shù)。

需要注意的兩個問題

(1) 不同的模板類型參數(shù):每個被指定為auto的參數(shù)都成為不同的模板類型參數(shù)。假設(shè)你有這樣一個函數(shù)模板:

template <typename T>
decltype(auto) add(const T& t1, const T& t2) {
    return t1 + t2;
}

這個版本只有一個模板類型參數(shù),而函數(shù)的兩個參數(shù) t1 和 t2 都是 const T& 類型。對于這樣的函數(shù)模板,你不能使用簡化語法,因?yàn)檫@將被轉(zhuǎn)換為具有兩個不同模板類型參數(shù)的函數(shù)模板。

(2) 無法顯式使用推導(dǎo)類型:你不能在函數(shù)模板的實(shí)現(xiàn)中顯式使用這些自動推導(dǎo)的類型,因?yàn)檫@些自動推導(dǎo)的類型沒有名稱。如果你需要這樣做,你要么需要繼續(xù)使用普通的函數(shù)模板語法,要么使用 decltype() 來確定類型。

// C++50 中的 auto 使用
auto auto(auto... args) {
    return (... + args);
}
責(zé)任編輯:趙寧寧 來源: coding日記
相關(guān)推薦

2023-12-14 10:23:01

C++模板函數(shù)

2023-12-13 10:51:49

C++函數(shù)模板編程

2023-09-25 12:12:01

C++自動返回

2024-02-19 08:11:40

C++編程尾返回類型推導(dǎo)

2023-12-24 12:56:14

C++函數(shù)語言

2010-02-05 17:34:37

C++函數(shù)模板

2010-02-04 14:22:25

C++函數(shù)模板非類型參

2024-01-29 01:30:00

函數(shù)C++編程

2023-11-22 13:22:51

C++函數(shù)

2010-02-02 09:49:02

C++模板

2025-05-20 08:10:00

函數(shù)函數(shù)類型函數(shù)指針類型

2023-09-01 21:20:06

授權(quán)委派KPI

2010-01-28 13:45:06

C++數(shù)組

2010-02-04 09:26:23

C++模板函數(shù)重載

2011-07-14 10:39:08

強(qiáng)制類型轉(zhuǎn)換函數(shù)C++

2010-01-28 16:31:54

C++類型

2023-12-18 11:15:03

2010-01-27 17:16:52

C++構(gòu)造函數(shù)

2010-01-26 10:42:26

C++函數(shù)

2010-01-28 13:57:19

C++指針基礎(chǔ)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 91文字幕巨乱亚洲香蕉 | 欧美成人激情 | 精精国产视频 | 欧美中文一区 | 看片91 | 亚洲国产一区在线 | 国产第1页 | 激情综合五月 | 99reav| 欧美色性| 成年人网站免费 | 天天天操操操 | 久久国产婷婷国产香蕉 | 欧美中文在线 | 日本大香伊一区二区三区 | 亚洲 中文 欧美 日韩 在线观看 | 狠狠躁天天躁夜夜躁婷婷老牛影视 | 天天草天天射 | 高清欧美性猛交 | 亚洲精品久久久久久国产精华液 | 成人a免费| 久久中文字幕一区 | 毛片免费在线 | 久久亚洲国产精品 | 91精品国产自产在线老师啪 | 久久精品天堂 | 天天操夜夜艹 | 日韩综合色 | 国产精品久久久久久吹潮 | 成人国产精品免费观看 | 99爱在线免费观看 | 中国av在线免费观看 | 亚洲91精品 | 欧美日韩在线免费 | 国产精品视频偷伦精品视频 | 亚洲免费在线视频 | 国产免费自拍 | 久久99国产精品 | 国产高清一区二区三区 | 黑人巨大精品欧美一区二区一视频 | 午夜欧美a级理论片915影院 |