C++17尝鲜:类模板中的模板参数自动推导
生活随笔
收集整理的這篇文章主要介紹了
C++17尝鲜:类模板中的模板参数自动推导
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
目錄
模板參數(shù)自動推導(dǎo)示例
自定義類模板中的應(yīng)用
Automatic deduction guides(自動推斷向?qū)?#xff09;
模板參數(shù)自動推導(dǎo)
在C++17之前,類模板構(gòu)造器的模板參數(shù)是不能像函數(shù)模板的模板參數(shù)那樣被自動推導(dǎo)的,比如我們無法寫
std::pair a{1, "a"s}; // C++17而只能寫
std::pair<int, string> a{1, "a"s}; // C++14為了彌補(bǔ)這一缺陷,標(biāo)準(zhǔn)庫為我們提供了 std::make_pair 函數(shù),通過函數(shù)模板的模板參數(shù)自動推導(dǎo)的功能,
免去我們在構(gòu)造 pair 時寫模板參數(shù)的麻煩。
這個解決方案其實(shí)并不太理想,這是因?yàn)?#xff1a;
在C++17中,這個問題得到了解決,類模板構(gòu)造器的模板參數(shù)同樣能夠被自動推導(dǎo)
std::pair a{1, "a"s}; // C++17 // 相當(dāng)于 // std::pair<int, string> a{1, "a"s}; // 和函數(shù)模板一樣,這里編譯器根據(jù) std::pair 構(gòu)造器所帶參數(shù)類型,自動推導(dǎo)出了構(gòu)造器模板的參數(shù)。由此我們不再需要 std::make_pair 之類的輔助函數(shù)了。
示例
#include <iostream> #include <vector> #include <functional> #include <string> #include <map> #include <algorithm> using namespace std;int main() {vector a = {1, 2, 3}; // C++17 // vector<int> a = {1, 2, 3}; // C++14function f = [](int a){return a + 1;}; // C++17 // function<int(int)> f = [](int a){return a + 1;}; // C++14tuple t{1, 2,5, "a"s}; // C++17 // tuple<int, double, string> t{1, 2,5, "a"s}; // C++14 // auto t = make_tuple(1, 2,5, "a"s); // C++14sort(a.begin(), a.end(), greater{}); // C++17 // sort(a.begin(), a.end(), greater<>{}); // C++14 // sort(a.begin(), a.end(), greater<int>{}); // C++11// map m = {{1, "a"s}, {2, "b"s}}; // {1, "a"s} 這種使用大括號的初始化列表沒有類型// 所以編譯器無法自動推導(dǎo) map 類模板的參數(shù)類型map m = {pair{1, "a"s}, {2, "b"s}}; // C++17 // map<int, string> m = {{1, "a"s}, {2, "b"s}}; // C++14 }自定義類模板中的應(yīng)用
template<typename T> struct Container {Container(T* ptr) {} // 構(gòu)造器 1Container(T& v) {} // 構(gòu)造器 2Container(T const& v) {} // 構(gòu)造器 3template<typename D>Container(T* ptr, D& deleter) {} // 構(gòu)造器 4 };struct Deleter {};int main() {Container c{(int*)0}; // 調(diào)用構(gòu)造器 1int x; Container c2{x}; // 調(diào)用構(gòu)造器 2Container c3{0}; // 調(diào)用構(gòu)造器 3Deleter d;Container c4{(int*)0, d}; // 調(diào)用構(gòu)造器 4 // 以上編譯器自動推導(dǎo)的結(jié)果都是 Container<int> }Automatic deduction guides(自動推斷向?qū)?#xff09;
有些情況下,編譯器無法對類模板的參數(shù)做出自動推導(dǎo),比如下面這種模板參數(shù)類型是個嵌套類型的情況。
此時我們需要添加自動推斷向?qū)韼椭幾g器來進(jìn)行自動推導(dǎo)。
自動推斷向?qū)问饺缦?#xff1a;
本文轉(zhuǎn)自:https://www.cnblogs.com/zwvista/p/7748363.html
總結(jié)
以上是生活随笔為你收集整理的C++17尝鲜:类模板中的模板参数自动推导的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ps中保存图片交错的含义
- 下一篇: C++ STL 四种智能指针