簡而言之,模板引數演繹是模板化類在沒有明確說明型別的情況下確定建構函式的傳遞引數型別的能力。
在c ++ 17之前,要構造模板化類的例項,我們必須顯式地宣告引數的型別(或使用make_xyz支援函式之一)。
考慮:std :: pair p(2,4.5);
1std :: pair p(2,4.5);
這裡,p是類對的乙個例項,並用值2和4.5初始化。或者實現這一目標的另一種方法是:
auto p = std :: make_pair(2,4.5);
1auto p = std :: make_pair(2,4.5);
兩種方法都有其缺點。建立像std :: make_pair這樣的「make函式」令人困惑,人為並且與非模板類的構造方式不一致。 std :: make_pair,std :: make_tuple等在標準庫中可用,但對於使用者定義的型別,它更糟糕:你必須編寫自己的make_ …函式。衛生署!
指定模板引數,如:
auto p = std :: pair (2,4.5)
1auto p = std :: pair (2,4.5)
應該是不必要的,因為它們可以從引數的型別推斷出來 - 就像模板函式一樣。
在c ++ 17中,已經廢除了為模板化類建構函式指定型別的這一要求。這意味著我們現在可以寫:
auto p = std :: pair(2,4.5);
1auto p = std :: pair(2,4.5);
要麼std :: pair p(2,4.5);
1std :: pair p(2,4.5);
這是你期望能夠定義p的邏輯方式!
所以考慮早期的函式mytuple()。使用template argument deduction(和函式返回型別的auto),考慮:
auto mytuple()
auto mytuple()
這是一種更清晰的編碼方式 -
C 模板模板引數
c 模板的使用一共有以下幾種情況。而本篇介紹模板模板引數。模板引數就是模板的引數,我們一般指定為t型別,實際上可以使用任何的名字,例如指定乙個foo的模板引數 temlate foo calc const foo a,const foo b 而模板模板引數則是模板的引數又是乙個模板,例如 templ...
C 模板模板引數
模板引數就是模板的引數,我們一般指定為t型別,實際上可以使用任何的名字,例如指定乙個foo的模板引數 temlate foo calc const foo a,const foo b 而模板模板引數則是模板的引數又是乙個模板,例如 templatetypename container class x...
玩轉c 模板模板引數
include include include include using namespace std if 1 case1 不使用模版模版引數,明確指定容器的型別,比如stl庫的stack實現,見下 template typename t,typename cont std deque class...