最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解C++17中類(lèi)模板參數(shù)推導(dǎo)的使用

 更新時(shí)間:2024年03月06日 09:53:41   作者:fengbingchun  
自C++17起就通過(guò)使用類(lèi)模板參數(shù)推導(dǎo),只要編譯器能根據(jù)初始值推導(dǎo)出所有模板參數(shù),那么就可以不指明參數(shù),下面我們就來(lái)看看C++17中類(lèi)模板參數(shù)推導(dǎo)的具體使用吧

在C++17之前,必須明確指出類(lèi)模板的所有參數(shù)。自從C++17起必須指明類(lèi)模板參數(shù)的限制被放寬了。通過(guò)使用類(lèi)模板參數(shù)推導(dǎo)(Class Template Argument Deduction(CTAD)),只要編譯器能根據(jù)初始值推導(dǎo)出所有模板參數(shù),那么就可以不指明參數(shù)。

C++17中的類(lèi)模板參數(shù)推導(dǎo):允許從構(gòu)造函數(shù)參數(shù)推導(dǎo)模板參數(shù),簡(jiǎn)而言之,編譯器可以根據(jù)構(gòu)造函數(shù)參數(shù)自動(dòng)推導(dǎo)它們,而不是顯式指定模板參數(shù)。

用戶(hù)定義的推導(dǎo)指南(User-defined deduction guides):允許你為類(lèi)模板參數(shù)推導(dǎo)提供自定義規(guī)則。這些指南幫助編譯器根據(jù)構(gòu)造函數(shù)參數(shù)推斷模板參數(shù)。

別名模板的推導(dǎo)(deduction for alias templates):允許你根據(jù)別名模板的基礎(chǔ)類(lèi)型或值(underlying type or value)推導(dǎo)別名模板的模板參數(shù)。

注意:

(1).推導(dǎo)過(guò)程中模板參數(shù)必須沒(méi)有歧義。

(2).推導(dǎo)模板參數(shù)時(shí)不會(huì)使用隱式類(lèi)型轉(zhuǎn)換。

(3).僅當(dāng)不存在模板參數(shù)列表時(shí)才執(zhí)行類(lèi)模板參數(shù)推導(dǎo)。如果指定了模板參數(shù)列表,則不會(huì)發(fā)生推導(dǎo)。

(4).類(lèi)模板參數(shù)推導(dǎo)過(guò)程中會(huì)首先嘗試以拷貝的方式初始化。

(5).類(lèi)模板不能只指明一部分模板參數(shù),然后指望編譯器去推導(dǎo)剩余的部分參數(shù)。

(6).在任何情況下,對(duì)于像std::vector<>或其他STL容器一樣擁有復(fù)雜的構(gòu)造函數(shù)的類(lèi)模板,強(qiáng)烈建議不要使用類(lèi)模板參數(shù)推導(dǎo),而是顯式指明類(lèi)型。

(7).智能指針沒(méi)有推導(dǎo)指引。

以下為測(cè)試代碼:

namespace {
 
template<typename T>
class Foo {
public:
	Foo(T value)
	{
		std::cout << "Created Foo, type id: " << typeid(T).name() << ", value: " << value << "\n";
	}
};
 
template<typename T>
class Foo2 {
public:
	Foo2(T value)
	{
		std::cout << "Created Foo2, type id: " << typeid(T).name() << ", value: " << value << "\n";
	}
};
 
// User-defined deduction guide 
template<typename T> Foo2(T)->Foo2<T>;
 
template<typename T> using MyAlias = T;
 
template<typename T>
class Foo3 {
public:
	Foo3(const std::initializer_list<T>& list) : vec_(list) {}
	void print() const
	{
		for (const auto& val : vec_) {
			std::cout << val << " ";
		}
		std::cout << "\n";
	}
 
private:
	std::vector<T> vec_;
};
 
} // namespace
 
int test_ctad()
{
	// 只要能根據(jù)初始值推導(dǎo)出所有模板參數(shù)就可以使用類(lèi)模板參數(shù)推導(dǎo)
	// 推導(dǎo)過(guò)程支持所有方式的初始化(只要保證初始化是有效的)
	std::pair p(2, 4.5);     // deduces to std::pair<int, double> p(2, 4.5);
	std::tuple t(4, 3, 2.5); // same as auto t = std::make_tuple(4, 3, 2.5);
	std::complex c{ 5.1, 3.3 }; // std::complex<double>
	std::mutex mx;
	std::lock_guard lg{ mx }; // std::lock_guard<std::mutex>
	std::vector vec{ "hello", "world" }; // std::vector<const char*>
 
	std::vector v1{ 42 };
	std::vector v2{ v1 }; // v2也是一個(gè)std::vector<int>,這是花括號(hào)初始化總是把列表中的參數(shù)作為元素這一規(guī)則的一個(gè)例外
	// 然而,如果用多于一個(gè)元素的初值列來(lái)初始化的話,就會(huì)把傳入的參數(shù)作為元素并推導(dǎo)出其類(lèi)型作為模板參數(shù)
	std::vector vv{ v1, v2 }; // vv是一個(gè)vector<vector<int>>
 
 
	// 1.Class Template Argument Deduction(CTAD)
	// not specifying the type of the template
	auto foo11 = Foo(88); // Created Foo, type id: int, value: 88
	auto foo12 = Foo("Beijing"); // Created Foo, type id: char const * __ptr64, value: Beijing
 
	// specifying the type of the template
	Foo<int> foo21(88); // Created Foo, type id: int, value: 88
	Foo<const char*> foo22("Beijing"); // Created Foo, type id: char const * __ptr64, value: Beijing
 
 
	// 2.User-defined deduction guides
	// not specifying the type of the template
	auto foo31 = Foo2(88); // Created Foo2, type id: int, value: 88
	auto foo32 = Foo2("Beijing"); // Created Foo2, type id: char const * __ptr64, value: Beijing
 
 
	// 3.the deduction for alias templates
	MyAlias<int> alias1{ 88 };
	MyAlias<std::string> alias2{ "Beijing" };
 
	std::cout << "alias1: " << alias1 << "\n"; // alias1: 88
	std::cout << "alias2: " << alias2 << "\n"; // alias2: Beijing
 
	// reference: https://www.geeksforgeeks.org/class-template-argument-deduction-in-cpp-17/
	auto foo41 = Foo3({ 1, 2, 3, 4, 5 });
	foo41.print(); // 1 2 3 4 5
 
	return 0;
}

執(zhí)行結(jié)果如下圖所示:

GitHubhttps://github.com/fengbingchun/Messy_Test

到此這篇關(guān)于詳解C++17中類(lèi)模板參數(shù)推導(dǎo)的使用的文章就介紹到這了,更多相關(guān)C++17類(lèi)模板參數(shù)推導(dǎo)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++ Cartographer加載配置文件過(guò)程介紹

    C++ Cartographer加載配置文件過(guò)程介紹

    這篇文章主要介紹了Cartographer加載配置文件過(guò)程,谷歌優(yōu)秀的激光SLAM開(kāi)源框架Cartographer算法簡(jiǎn)單,但是程序部分太多需要學(xué)習(xí)的地方了,不論是整體框架的結(jié)構(gòu),還是數(shù)據(jù)的使用,都是非常優(yōu)美的
    2023-03-03
  • C++的四種類(lèi)型轉(zhuǎn)換

    C++的四種類(lèi)型轉(zhuǎn)換

    這篇文章主要介紹了C++的四種類(lèi)型轉(zhuǎn)換,有詳細(xì)的示例代碼展示,對(duì)于學(xué)習(xí)C++的同學(xué)有一定的參考價(jià)值,感興趣的同學(xué)可以參考本文
    2023-04-04
  • c++帶有string的結(jié)構(gòu)體賦值和清零問(wèn)題

    c++帶有string的結(jié)構(gòu)體賦值和清零問(wèn)題

    這篇文章主要介紹了c++帶有string的結(jié)構(gòu)體賦值和清零問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • C語(yǔ)言實(shí)現(xiàn)歌手大獎(jiǎng)賽計(jì)分程序

    C語(yǔ)言實(shí)現(xiàn)歌手大獎(jiǎng)賽計(jì)分程序

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)歌手大獎(jiǎng)賽計(jì)分程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • C/C++中帶空格字符串的輸入講解

    C/C++中帶空格字符串的輸入講解

    這篇文章主要給大家介紹了關(guān)于如何解決C++中帶空格字符串的輸入問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧
    2021-09-09
  • 淺談2路插入排序算法及其簡(jiǎn)單實(shí)現(xiàn)

    淺談2路插入排序算法及其簡(jiǎn)單實(shí)現(xiàn)

    這篇文章主要介紹了淺談2路插入排序算法及其簡(jiǎn)單實(shí)現(xiàn),雖算不上是常用的排序方法,但在數(shù)據(jù)庫(kù)等方面依然有用上的機(jī)會(huì),需要的朋友可以參考下
    2015-08-08
  • C語(yǔ)言實(shí)現(xiàn)水波紋效果

    C語(yǔ)言實(shí)現(xiàn)水波紋效果

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)水波紋效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • 如何在C++中實(shí)現(xiàn)一個(gè)正確的時(shí)間循環(huán)器詳解

    如何在C++中實(shí)現(xiàn)一個(gè)正確的時(shí)間循環(huán)器詳解

    這篇文章主要給大家介紹了關(guān)于如何在C++中實(shí)現(xiàn)一個(gè)正確的時(shí)間循環(huán)器的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • C++微服務(wù)UserServer設(shè)計(jì)與實(shí)現(xiàn)方法詳解

    C++微服務(wù)UserServer設(shè)計(jì)與實(shí)現(xiàn)方法詳解

    在當(dāng)今云原生時(shí)代,微服務(wù)架構(gòu)已成為構(gòu)建大規(guī)模分布式系統(tǒng)的主流選擇,下面這篇文章主要介紹了C++微服務(wù)UserServer設(shè)計(jì)與實(shí)現(xiàn)的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-11-11
  • 淺析C/C++中動(dòng)態(tài)鏈接庫(kù)的創(chuàng)建和調(diào)用

    淺析C/C++中動(dòng)態(tài)鏈接庫(kù)的創(chuàng)建和調(diào)用

    下面小編就為大家?guī)?lái)一篇淺析C/C++中動(dòng)態(tài)鏈接庫(kù)的創(chuàng)建和調(diào)用。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧
    2016-05-05

最新評(píng)論

汶川县| 大足县| 德惠市| 博爱县| 大埔县| 定安县| 平邑县| 丹江口市| 临安市| 龙州县| 罗江县| 保靖县| 临夏县| 井陉县| 宿迁市| 永济市| 民勤县| 尉犁县| 洪江市| 乐业县| 建湖县| 平湖市| 达拉特旗| 离岛区| 长武县| 宽城| 普洱| 崇明县| 富民县| 罗源县| 辛集市| 新竹县| 图们市| 张家川| 乌兰察布市| 沁源县| 巴南区| 宁武县| 玉山县| 务川| 乌拉特后旗|