C++ åèæå
- C++11
- C++14
- C++17
- C++20
- C++ ç¼è¯å¨æ¯ææ åµè¡¨
- ç¬ç«ä¸å®¿ä¸»å®ç°
- C++ è¯è¨
- å鿍¡æ¿(C++14 èµ·)
- æ´æ°åé¢é
- èååå§å
- æ¯è¾è¿ç®ç¬¦
- é»è®¤æ¯è¾(C++20 èµ·)
- 转ä¹åºå
- for 循ç¯
- while 循ç¯
- ç¨æ·å®ä¹è½¬æ¢
- SFINAE
- 䏻彿°
- ASCII ç 表
- æ è¯ç¬¦
- ç±»å
- å 忍¡å
- 对象
- åºæ¬æ¦å¿µ
- 表达å¼
- 声æ
- åå§å
- 彿°
- è¯å¥
- ç±»
- è¿ç®ç¬¦éè½½
- 模æ¿
- å¼å¸¸
- äºå¡æ§å å
- å ä½ç¬¦ç±»å说æç¬¦ (C++11 èµ·)
- decltype 说æç¬¦
- 彿°å£°æ
- final 说æç¬¦ (C++11 èµ·)
- override 说æç¬¦(C++11 èµ·)
- å¼ç¨å£°æ
- ç§»å¨æé 彿°
- ç§»å¨èµå¼è¿ç®ç¬¦
- æä¸¾å£°æ
- constexpr 说æç¬¦(C++11 èµ·)
- å表åå§å (C++11 èµ·)
- æé 彿°ä¸æååå§åå¨å表
- using 声æ
- nullptrï¼æéåé¢é
- åºç¡ç±»å
- ç±»åå«åï¼å«å模ç (C++11 èµ·)
- å½¢åå
- èåä½å£°æ
- å符串åé¢é
- ç¨æ·å®ä¹åé¢é (C++11 èµ·)
- 屿§è¯´æç¬¦åºå(C++11 èµ·)
- Lambda è¡¨è¾¾å¼ (C++11 èµ·)
- noexcept 说æç¬¦ (C++11 èµ·)
- noexcept è¿ç®ç¬¦ (C++11 èµ·)
- alignof è¿ç®ç¬¦(C++11 èµ·)
- alignas 说æç¬¦ (C++11 èµ·)
- åå¨ç±»è¯´æç¬¦
- åºäºèå´ç for å¾ªç¯ (C++11 èµ·)
- static_assert 声æ
- éå¼è½¬æ¢
- 代ç¨è¿ç®ç¬¦è¡¨ç¤º
- èªå¢/èªåè¿ç®ç¬¦
- æå 表达å¼(C++17 èµ·)
- 类模æ¿å®åæ¨å¯¼(C++17 èµ·)
- 模æ¿å½¢å䏿¨¡æ¿å®å
- if è¯å¥
- inline 说æç¬¦
- ç»æåç»å®å£°æ (C++17 èµ·)
- switch è¯å¥
- å符åé¢é
- å½å空é´
- æ±å¼é¡ºåº
- å¤å¶æ¶é¤
- consteval 说æç¬¦ (C++20 èµ·)
- constinit 说æç¬¦ (C++20 èµ·)
- åç¨ (C++20)
- 模å (C++20 èµ·)
- 约æä¸æ¦å¿µ (C++20 èµ·)
- new 表达å¼
- do-while 循ç¯
- continue è¯å¥
- break è¯å¥
- goto è¯å¥
- return è¯å¥
- 卿å¼å¸¸è¯´æ
- throw 表达å¼
- try å
- å½å空é´å«å
- 类声æ
- cvï¼const ä¸ volatileï¼ç±»åéå®ç¬¦
- é»è®¤åå§å
- å¼åå§å(C++03 èµ·)
- é¶åå§å
- å¤å¶åå§å
- ç´æ¥åå§å
- 常éåå§å
- å¼ç¨åå§å
- å¼ç±»å«
- C++ è¿ç®ç¬¦ä¼å 级
- å¸å°åé¢é
- æµ®ç¹åé¢é
- typedef 说æç¬¦
- æ¾å¼ç±»å转æ¢
- static_cast 转æ¢
- dynamic_cast 转æ¢
- const_cast 转æ¢
- reinterpret_cast 转æ¢
- delete 表达å¼
- æé 彿°ä¸æååå§åå¨å表
- this æé
- 访é®è¯´æç¬¦
- åå 声æ
- virtual 彿°è¯´æç¬¦
- explicit 说æç¬¦
- éææå
- é»è®¤æé 彿°
- å¤å¶æé 彿°
- å¤å¶èµå¼è¿ç®ç¬¦
- ææå½æ°
- 类模æ¿
- 彿°æ¨¡æ¿
- æ¾å¼ï¼å ¨ï¼æ¨¡æ¿ç¹å
- æ±ç¼å£°æ
- C++ çåå²
- ä½ç¨å
- çåæ
- å®ä¹ä¸åä¸å®ä¹è§åï¼ODRï¼
- å忥æ¾
- æéå®çå忥æ¾
- æ éå®çå忥æ¾
- å¦åè§å
- æªå®ä¹è¡ä¸º
- ç¿»è¯é¶æ®µ
- 常é表达å¼
- èµå¼è¿ç®ç¬¦
- ç®æ¯è¿ç®ç¬¦
- é»è¾è¿ç®ç¬¦
- æå访é®è¿ç®ç¬¦
- å ¶ä»è¿ç®ç¬¦
- sizeof è¿ç®ç¬¦
- typeid è¿ç®ç¬¦
- æé声æ
- æ°ç»å£°æ
- è¯è¨é¾æ¥
- 详述类å说æç¬¦
- é»è®¤å®å
- åé¿å®å
- å®åä¾èµæ¥æ¾
- éè½½å³è®®
- éè½½å½æ°çå°å
- æ³¨å ¥ç±»å
- ééææ°æ®æå
- ééææå彿°
- åµå¥ç±»
- æ´¾çç±»
- 空åºç±»ä¼å
- æ½è±¡ç±»
- ä½å
- è½¬æ¢æé 彿°
- æå模æ¿
- 模æ¿å®åæ¨å¯¼
- é¨å模æ¿ç¹å
- sizeof... è¿ç®ç¬¦
- å¾ å³å
- 彿° try å
- æ©å å½åç©ºé´ std
- åæ¯ç¼©å
- RAII
- ä¸/äº/é¶ä¹æ³å
- PImpl
- é¶å¼éåå
- ç±»å
- éå¼è½¬æ¢
- 注é
- C++ å ³é®è¯
- é¢å¤çå¨
- C++ æ ååºå¤´æä»¶
- å ·åè¦æ±
- åè½ç¹æ§æµè¯ (C++20)
- å·¥å ·åº
- ç±»åæ¯æï¼åºæ¬ç±»åãRTTIãç±»åç¹æ§ï¼
- æ¦å¿µåº (C++20)
- é误å¤ç
- 卿å å管ç
- æ¥æåæ¶é´å·¥å ·
- å符串åº
- 容å¨åº
- è¿ä»£å¨åº
- èå´åº (C++20)
- ç®æ³åº
- æ°å¼åº
- è¾å ¥/è¾åºåº
- æä»¶ç³»ç»åº
- æ¬å°ååº
- æ£å表达å¼åº
- ååæä½åº
- çº¿ç¨æ¯æåº
- å®éªæ§ C++ ç¹æ§
- æç¨çèµæº
- ç´¢å¼
- std 符å·ç´¢å¼
- åç¨æ¯æ (C++20)
- C++ å ³é®è¯
ä½ç½®ï¼é¦é¡µ > C++ åèæå >C++ è¯è¨ > 模æ¿å½¢å䏿¨¡æ¿å®å
模æ¿å½¢å䏿¨¡æ¿å®å
æ¯ä¸ªæ¨¡æ¿é½æ¯ç±ä¸æå¤ä¸ªæ¨¡æ¿å½¢åæåæ°åçï¼å®ä»¬å¨æ¨¡æ¿å£°æè¯æ³ä¸ç å½¢åå表 䏿å®ï¼
template < å½¢åå表 > 声æ
|
(1) | ||||||||
å½¢åå表 ä¸çæ¯ä¸ªå½¢åå¯ä»¥æ¯ï¼
- éç±»åæ¨¡æ¿å½¢åï¼
- ç±»åæ¨¡æ¿å½¢åï¼
- æ¨¡æ¿æ¨¡æ¿å½¢åã
éç±»åæ¨¡æ¿å½¢å
| ç±»å åå(å¯é) | (1) | ||||||||
ç±»å åå(å¯é) = default
|
(2) | ||||||||
ç±»å ... åå(å¯é)
|
(3) | (C++11 èµ·) | |||||||
| å ä½ç¬¦ åå | (4) | (C++17 èµ·) | |||||||
auto çä»»ä½ç±»åï¼ä¾å¦å纯ç autoãauto ** æ auto &ï¼ï¼è¢«æ¨å¯¼ç±»ç±»åçå ä½ç¬¦ (C++20 èµ·)ï¼æè
decltype(auto)ãéç±»åæ¨¡æ¿å½¢åå¿ é¡»æ¥æç»æåç±»åï¼å®æ¯ä¸åç±»åä¹ä¸ï¼å¯éå°æ cv éå®ï¼å¿½ç¥éå®ç¬¦ï¼ï¼
- ï¼å°å¯¹è±¡æå½æ°çï¼å·¦å¼å¼ç¨ç±»åï¼
- æ´æ°ç±»åï¼
- ï¼æå对象æå½æ°çï¼æéç±»åï¼
- ï¼æåæå对象ææå彿°çï¼æåæéç±»åï¼
- æä¸¾ç±»åï¼
|
(C++11 èµ·) |
|
(C++20 èµ·) |
æ°ç»ä¸å½æ°ç±»åå¯ä»¥å卿¨¡æ¿å£°æä¸ï¼ä½å®ä»¬è¢«èªå¨æ¿æ¢ä¸ºéåç对象æéå彿°æéã
å½å¨ç±»æ¨¡æ¿ä½å 使ç¨éç±»åæ¨¡æ¿å½¢åçååæ¶ï¼å®æ¯ä¸å¯ä¿®æ¹ç纯å³å¼ï¼é¤éå ¶ç±»åæ¯å·¦å¼å¼ç¨ç±»åï¼æå ¶ç±»åæ¯ç±»ç±»å (C++20 èµ·)ã
å½¢å¼ä¸º class Foo çæ¨¡æ¿å½¢å䏿¯ç±»å为 Foo çéç±»åæ¨¡æ¿å½¢åï¼è½ç¶ class Foo è¿è½æ¯è¯¦è¿°ç±»å说æç¬¦ä¸ class Foo x; 声æ x 为 Foo ç±»åç对象ã
|
è¥éç±»åæ¨¡æ¿å½¢åçç±»åå
å«å ä½ç¬¦ç±»å template<auto n> struct B { /* ... */ }; B<5> b1; // OKï¼éç±»åæ¨¡æ¿å½¢åç±»å为 int B<'a'> b2; // OKï¼éç±»åæ¨¡æ¿å½¢åç±»å为 char B<2.5> b3; // é误ï¼éç±»åæ¨¡æ¿å½¢åç±»åä¸è½æ¯ double 对äºç±»åä¸ä½¿ç¨äºå ä½ç¬¦ç±»åçéç±»åæ¨¡æ¿å½¢åå ï¼æ¯ä¸ªæ¨¡æ¿å®åçç±»åæ¯ç¬ç«å°è¿è¡æ¨å¯¼çï¼èä¸ä¸éè¦äºç¸å¹é ï¼ template<auto...> struct C {}; C<'C', 0, 2L, nullptr> x; // OK |
(C++17 èµ·) |
|
æå类类å struct A { friend bool operator==(const A&, const A&) = default; }; template<A a> void f() { &a; // OK const A& ra = a, &rb = a; // é½ç»å®å°å䏿¨¡æ¿å½¢å对象 assert(&ra == &rb); // éè¿ } |
(C++20 èµ·) |
ç±»åæ¨¡æ¿å½¢å
| ç±»åå½¢åå ³é®è¯ åå(å¯é) | (1) | ||||||||
ç±»åå½¢åå
³é®è¯ åå(å¯é) = é»è®¤å¼
|
(2) | ||||||||
ç±»åå½¢åå
³é®è¯ ... åå(å¯é)
|
(3) | (C++11 èµ·) | |||||||
| ç±»åå¶çº¦ åå(å¯é) | (4) | (C++20 èµ·) | |||||||
ç±»åå¶çº¦ åå(å¯é) = é»è®¤å¼
|
(5) | (C++20 èµ·) | |||||||
ç±»åå¶çº¦ ... åå(å¯é)
|
(6) | (C++20 èµ·) | |||||||
| ç±»åå¶çº¦ | - | æä¸ºæ¦å¿µçååï¼æä¸ºæ¦å¿µåå鿍¡æ¿å®åå表ï¼å¨è§æ¬å·ä¸ï¼ãæ 论ä½ç§æ¹å¼ï¼æ¦å¿µååå¯éæéå® |
ç±»åå½¢åå
³é®è¯ æ¯ typename æ class ä¹ä¸ãè¿ä¸¤ä¸ªå
³é®è¯å¨ç±»å模æ¿å½¢å声æä¸æ²¡æåºå«ã
template<class T> class My_vector { /* ... */ };
template<class T = void> struct My_op_functor { /* ... */ };
å½¢åçå忝å¯éçï¼
// 对ä¸é¢æç¤ºæ¨¡æ¿ç声æï¼ template<class> class My_vector; template<class = void> struct My_op_functor; template<typename...> class My_tuple;
卿¨¡æ¿å£°æä½å ï¼ç±»åå½¢åä¹åæ¯ typedef åï¼æ¯å½æ¨¡æ¿è¢«å®ä¾åæ¶ææä¾çç±»åçå«åã
|
æ¯ä¸ªæå¶çº¦å½¢å
template<typename T> concept C1 = true; template<typename... Ts> concept C2 = true; // ååæ¦å¿µ template<typename T, typename U> concept C3 = true;  template<C1 T> struct s1; // å¶çº¦è¡¨è¾¾å¼ä¸º C1<T> template<C1... T> struct s2; // å¶çº¦è¡¨è¾¾å¼ä¸º (C1<T> && ...) template<C2... T> struct s3; // å¶çº¦è¡¨è¾¾å¼ä¸º (C2<T> && ...) template<C3<int> T> struct s4; // å¶çº¦è¡¨è¾¾å¼ä¸º C3<T, int> template<C3<int>... T> struct s5; // å¶çº¦è¡¨è¾¾å¼ä¸º (C3<T, int> && ...) |
(C++20 èµ·) |
æ¨¡æ¿æ¨¡æ¿å½¢å
template < å½¢åå表 > typename(C++17)|class åå(å¯é)
|
(1) | ||||||||
template < å½¢åå表 > typename(C++17)|class åå(å¯é) = default
|
(2) | ||||||||
template < å½¢åå表 > typename(C++17)|class ... åå(å¯é)
|
(3) | (C++11 èµ·) | |||||||
|
ä¸åäºç±»å模æ¿å½¢å声æï¼æ¨¡æ¿æ¨¡æ¿å½¢ååªè½ç¨å
³é®è¯ |
(C++17 å) |
卿¨¡æ¿å£°æä½å ï¼æ¤å½¢åçå忝ä¸ä¸ªæ¨¡æ¿åï¼ä¸éè¦å®å以å®ä¾åï¼ã
template<typename T> class my_array {};  // ä¸¤ä¸ªç±»åæ¨¡æ¿å½¢ååä¸ä¸ªæ¨¡æ¿æ¨¡æ¿å½¢åï¼ template<typename K, typename V, template<typename> typename C = my_array> class Map { C<K> key; C<V> value; };
模æ¿å®å
为使模æ¿è¢«å®ä¾åï¼å ¶æ¯ä¸ªæ¨¡æ¿å½¢åï¼ç±»åãéç±»åææ¨¡æ¿ï¼å¿ é¡»ç±ä¸ä¸ªå¯¹åºç模æ¿å®åææ¿æ¢ã对äºç±»æ¨¡æ¿ï¼å®åæè¢«æ¾å¼æä¾ï¼æä»åå§å卿¨å¯¼ï¼ (C++17 èµ·)æä¸ºé»è®¤ã对äºå½æ°æ¨¡æ¿ï¼å®åæè¢«æ¾å¼æä¾ï¼æä»è¯å¢æ¨å¯¼ï¼æä¸ºé»è®¤ã
è¥å®ååæ¶å¯è¢«è§£éæç±»åæ è¯å表达å¼ï¼åå®å§ç»è¢«è§£éæç±»åæ è¯ï¼å³ä½¿å ¶å¯¹åºçæ¯éç±»åæ¨¡æ¿å½¢å乿¯å¦æ¤ï¼
template<class T> void f(); // #1 template<int I> void f(); // #2 void g() { f<int()>(); // "int()" æ¢æ¯ç±»ååæ¯è¡¨è¾¾å¼ï¼ // è°ç¨ #1 å 为å®è¢«è§£éæç±»å }
模æ¿éç±»åå®å
å®ä¾åæ¥æéç±»åæ¨¡æ¿å½¢åçæ¨¡æ¿æ¶ï¼åºç¨ä¸åéå¶ï¼
ç¹å«æ¯ï¼è¿æå³çå符串åé¢éãæ°ç»å ç´ çå°ååééææåçå°åï¼ä¸è½è¢«ç¨ä½æ¨¡æ¿å®åï¼æ¥å®ä¾åå ¶å¯¹åºéç±»åæ¨¡æ¿å½¢åæ¯å¯¹è±¡æéçæ¨¡æ¿å½¢åçæ¨¡æ¿ã |
(C++17 å) |
|
éç±»åæ¨¡æ¿å½¢åå¯ä»¥ä½¿ç¨ç模æ¿å®åï¼å¯ä»¥æ¯è¯¥æ¨¡æ¿å½¢åç±»åçä»»ä½ç»è½¬æ¢å¸¸é表达å¼ã template<const int* pci> struct X {}; int ai[10]; X<ai> xi; // okï¼æ°ç»å°æé转æ¢å cv éå®è½¬æ¢  struct Y {}; template<const Y& b> struct Z {}; Y y; Z<y> z; // okï¼æ è½¬æ¢ Â template<int (&pa)[5]> struct W {}; int b[5]; W<b> w; // okï¼æ è½¬æ¢ Â void f(char); void f(int); template<void (*pf)(int)> struct A {}; A<&f> a; // okï¼éè½½å³è®®éæ© f(int) ä» æçä¾å¤æ¯ï¼å¼ç¨ææéç±»åçéç±»åæ¨¡æ¿å½¢åï¼ä»¥å类类åçéç±»åæ¨¡æ¿å½¢ååå ¶å对象ä¹ä¸çå¼ç¨ææéç±»åçééææ°æ®æå (C++20 èµ·)ï¼ä¸è½æä»£ä¸å对象/æ¯ä¸å对象çå°å
template<class T, const char* p> class X {}; X<int, "Studebaker"> x1; // é误ï¼å符串åé¢éç¨ä½æ¨¡æ¿å®å  template<int* p> class X {}; int a[10]; struct S { int m; static int s; } s; X<&a[2]> x3; // éè¯¯ï¼æ°ç»å ç´ çå°å X<&s.m> x4; // é误ï¼ééææåçå°å X<&s.s> x5; // okï¼éææåçå°å X<&S::s> x6; // okï¼éææåçå°å  template<const int& CRI> struct B {}; B<1> b2; // é误ï¼ä¸´æ¶éä¼ä¸ºæ¨¡æ¿å®åæè¦æ± int c = 1; B<c> b1; // ok |
(C++17 èµ·) |
模æ¿ç±»åå®å
ç±»åæ¨¡æ¿å½¢åçæ¨¡æ¿å®åå¿ é¡»æ¯ç±»åæ è¯ï¼å®å¯ä»¥æåä¸å®æ´ç±»åï¼
template<typename T> class X {}; // ç±»æ¨¡æ¿ Â struct A; // ä¸å®æ´ç±»å typedef struct {} B; // æ åç±»åçç±»åå«å  int main() { X<A> x1; // okï¼'A' æåç±»å X<A*> x2; // okï¼'A*' æåç±»å X<B> x3; // okï¼'B' æåç±»å }
æ¨¡æ¿æ¨¡æ¿å®å
æ¨¡æ¿æ¨¡æ¿å½¢åçæ¨¡æ¿å®åæ¯å¿ é¡»æ¯ä¸ä¸ª æ è¯è¡¨è¾¾å¼ï¼å®æåä¸ä¸ªç±»æ¨¡æ¿ææ¨¡æ¿å«åã
å½å®åæ¯ç±»æ¨¡æ¿æ¶ï¼è¿è¡å½¢åå¹é æ¶åªèèå ¶ä¸»æ¨¡æ¿ãé¨åç¹åè¥åå¨ï¼ä¹ä» å¨åºäºæ¤æ¨¡æ¿æ¨¡æ¿å½¢åçç¹åæ°å¥½è¦è¢«å®ä¾åæ¶æäºä»¥èèã
template<typename T> class A { int x; }; // ä¸»æ¨¡æ¿ template<class T> class A<T*> { long x; }; // é¨åç¹å  // å¸¦ææ¨¡æ¿æ¨¡æ¿å½¢å V çç±»æ¨¡æ¿ template<template<typename> class V> class C { V<int> y; // 使ç¨ä¸»æ¨¡æ¿ V<int*> z; // 使ç¨é¨åç¹å };  C<A> c; // c.y.x ç±»å为 intï¼c.z.x ç±»å为 long
为å¹é
æ¨¡æ¿æ¨¡æ¿å®å A 䏿¨¡æ¿æ¨¡æ¿å½¢å Pï¼A çæ¯ä¸ªæ¨¡æ¿å½¢åå¿
é¡»ä¸ P çå¯¹åºæ¨¡æ¿å½¢åä¸¥æ ¼å¹é
(C++17 å)P å¿
é¡»è³å°ä¸ A 䏿 ·ç¹æ® (C++17 èµ·)ãè¥ P çå½¢åå表å
å«ä¸ä¸ªå½¢åå
ï¼åæ¥èª A çæ¨¡æ¿å½¢åå表ä¸çé¶ææ´å¤æ¨¡æ¿å½¢åï¼æå½¢åå
ï¼ä¸ä¹å¹é
ã
template<typename T> struct eval; // ä¸»æ¨¡æ¿ Â template<template<typename, typename...> class TT, typename T1, typename... Rest> struct eval<TT<T1, Rest...>> {}; // eval çé¨åç¹å  template<typename T1> struct A; template<typename T1, typename T2> struct B; template<int N> struct C; template<typename T1, int N> struct D; template<typename T1, typename T2, int N = 17> struct E;  eval<A<int>> eA; // okï¼å¹é eval çé¨åç¹å eval<B<int, float>> eB; // okï¼å¹é eval çé¨åç¹å eval<C<17>> eC; // é误ï¼C å¨é¨åç¹åä¸ä¸å¹é TTï¼å 为 TT çé¦ä¸ªå½¢åæ¯ç±»å模æ¿å½¢å // è 17 䏿åç±»å eval<D<int, 17>> eD; // é误ï¼D å¨é¨åç¹åä¸ä¸å¹é TTï¼ // å 为 TT ç第äºå½¢åæ¯ç±»åå½¢åå ï¼è 17 䏿åç±»å eval<E<int, float>> eE; // é误ï¼E å¨é¨åç¹åä¸ä¸å¹é TT // å 为 E ç第ä¸ï¼é»è®¤ï¼å½¢åæ¯éç±»åå½¢å
template<class T> class A { /* ... */ }; template<class T, class U = T> class B { /* ... */ }; template <class ...Types> class C { /* ... */ };  template<template<class> class P> class X { /* ... */ }; X<A> xa; // OK X<B> xb; // C++17 å¨ CWG 150 å OK // æ´æ©æ¶ä¸ºé误ï¼éä¸¥æ ¼å¹é X<C> xc; // C++17 å¨ CWG 150 å OK // æ´æ©æ¶ä¸ºé误ï¼éä¸¥æ ¼å¹é  template<template<class ...> class Q> class Y { /* ... */ }; Y<A> ya; // OK Y<B> yb; // OK Y<C> yc; // OK  template<auto n> class D { /* ... */ }; // 注æï¼C++17 template<template<int> class R> class Z { /* ... */ }; Z<D> zd; // OK  template <int> struct SI { /* ... */ }; template <template <auto> class> void FA(); // 注æï¼C++17 FA<SI>(); // é误
|
æ£å¼æ¥è¯´ï¼ç»å®ä»¥ä¸å¯¹ä¸¤ä¸ªå½æ°æ¨¡æ¿çéåï¼æ ¹æ®å½æ°æ¨¡æ¿çé¨åæåºè§åï¼å¦æå¯¹åºäºæ¨¡æ¿æ¨¡æ¿å½¢å
è¥éåçæäºéæ³ç±»åï¼å |
(C++17 èµ·) |
é»è®¤æ¨¡æ¿å®å
é»è®¤æ¨¡æ¿å®åå¨å½¢åå表ä¸äº = å·ä¹åæå®ãå¯ä»¥ä¸ºä»»ä½ç§ç±»ç模æ¿å½¢åï¼ç±»åãéç±»åææ¨¡æ¿ï¼æå®é»è®¤å®åï¼ä½ä¸è½å¯¹å½¢åå æå®ã
è¥ä¸ºä¸»ç±»æ¨¡æ¿ã主å鿍¡æ¿ (C++14 èµ·)æå«å模ççæ¨¡æ¿å½¢åæå®é»è®¤å®åï¼åå ¶æ¯ä¸ªå继模æ¿å½¢åé½å¿ é¡»æé»è®¤å®åï¼ä½æåä¸ä¸ªå¯ä»¥æ¯æ¨¡æ¿å½¢åå ãå¨å½æ°æ¨¡æ¿ä¸ï¼å¯¹è·å¨é»è®¤å®åä¹åç形忲¡æéå¶ï¼èä» å½ç±»åå½¢åå ·æé»è®¤å®åï¼æå¯ä»å½æ°å®åæ¨å¯¼æ¶ï¼æå¯è·å¨å½¢åå ä¹åã
以䏿 åµä¸å 许é»è®¤å½¢å
- å¨ç±»æ¨¡æ¿çæåçç±»å¤å®ä¹ä¸ï¼å¿ é¡»å¨ç±»ä½å ç声æä¸æä¾å®ä»¬ï¼ã注æé模æ¿ç±»çæå模æ¿å¯ä»¥å¨å ¶ç±»å¤å®ä¹ä¸ä½¿ç¨é»è®¤å½¢åï¼è§ GCC æ¼æ´ 53856ï¼
- å¨åå 类模æ¿å£°æä¸
|
(C++11 å) |
|
å¨åå 彿°æ¨¡æ¿ç声æä¸ï¼ä» å½å£°ææ¯å®ä¹ï¼ä¸æ¤ç¿»è¯åå ä¸åºç°æ¤å½æ°çå ¶ä»å£°ææ¶ï¼æå 许é»è®¤æ¨¡æ¿å®åã |
(C++11 èµ·) |
å个声æåå®ä¹ä¸æåºç°çé»è®¤æ¨¡æ¿å®åï¼ä»¥ç±»ä¼¼é»è®¤å½æ°å®åçæ¹å¼åå¹¶ï¼
template<typename T1, typename T2 = int> class A; template<typename T1 = int, typename T2> class A; // å¦ä¸ä¸å¦ä¸ç¸åï¼ template<typename T1 = int, typename T2 = int> class A;
ä½å¨åä¸ä½ç¨åä¸ä¸è½ä¸¤æ¬¡ä¸ºåä¸å½¢åæå®é»è®¤å®å
template<typename T = int> class X; template<typename T = int> class X {}; // é误
æ¨¡æ¿æ¨¡æ¿å½¢åçæ¨¡æ¿å½¢ååè¡¨å¯æ¥æå ¶èªå·±çé»è®¤å®åï¼å®ä» 卿¨¡æ¿æ¨¡æ¿å®åèªèº«å¤äºä½ç¨å䏿¶ææï¼
// 类模æ¿ï¼å¸¦æé»è®¤å®åçç±»åæ¨¡æ¿å½¢å template<typename T = float> struct B {};  // æ¨¡æ¿æ¨¡æ¿å½¢å T æå½¢ååè¡¨ï¼ // å®ç±ä¸ä¸ªå¸¦é»è®¤å®åçç±»åæ¨¡æ¿å½¢åç»æ template<template<typename = float> typename T> struct A { void f(); void g(); };  // ç±»ä½å¤çæå彿°æ¨¡æ¿å®ä¹ template<template<typename TT> class T> void A<T>::f() { T<> t; // é误ï¼TT å¨ä½ç¨å䏿 é»è®¤å®å } template<template<typename TT = char> class T> void A<T>::g() { T<> t; // okï¼t 为 T<char> }
é»è®¤æ¨¡æ¿å½¢å䏿ç¨çååçæå访é®ï¼å¨å£°æä¸ï¼èéå¨ä½¿ç¨ç¹æ£æ¥ï¼
class B {};  template<typename T> class C { protected: typedef T TT; };  template<typename U, typename V = typename U::TT> class D: public U {};  D<C<B>>* d; // é误ï¼C::TT 为åä¿æ¤
|
é»è®¤æ¨¡æ¿å®åå¨éè¦è¯¥é»è®¤å®åç弿¶è¢«éå¼å®ä¾åï¼é¤é模æ¿ç¨äºæå彿°ï¼ template<typename T, typename U = int> struct S { }; S<bool>* p; // é»è®¤æ¨¡æ¿å®å U 卿¤ç¹å®ä¾å // p çç±»åæ¯ S<bool, int>* |
(C++14 èµ·) |
示ä¾
#include <iostream>  // ç®åçéç±»åæ¨¡æ¿å½¢å template<int N> struct S { int a[N]; };  template<const char*> struct S2 {};  // 夿çéç±»åå½¢åçä¾å template < char c, // æ´åç±»å int (&ra)[5], // å°ï¼æ°ç»ç±»åï¼å¯¹è±¡çå·¦å¼å¼ç¨ int (*pf)(int), // 彿°æé int (S<10>::*a)[10] // æåï¼int[10] ç±»åçï¼æå对象çæé > struct Complicated { // è°ç¨ç¼è¯æ¶æéæ©ç彿° // å¹¶å¨ç¼è¯æ¶å°å ¶ç»æåå¨äºæ°ç»ä¸ void foo(char base) { ra[4] = pf(c - base); } };  S2<"fail"> s2; // é误ï¼ä¸è½ç¨å符串åé¢é char okay[] = "okay"; // æè¿æ¥çéæå¯¹è±¡ S2< &okay[0] > s2; // éè¯¯ï¼æ°ç»å ç´ æ è¿æ¥ S2<okay> s2; // è½ç¨  int a[5]; int f(int n) { return n; }  int main() { S<10> s; // s.a æ¯ 10 个 int çæ°ç» s.a[9] = 4;  Complicated<'2', a, f, &S<10>::a> c; c.foo('0');  std::cout << s.a[9] << a[4] << '\n'; }
è¾åºï¼
42
| æ¬èæªå®æ åå ï¼æ´å¤ç¤ºä¾ |