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++ è¯è¨ > å½¢åå
å½¢åå
模æ¿å½¢åå æ¯æ¥åé¶ææ´å¤æ¨¡æ¿å®åï¼éç±»åãç±»åææ¨¡æ¿ï¼ç模æ¿å½¢åã彿°æ¨¡æ¿å½¢åå æ¯æ¥åé¶ææ´å¤å½æ°å®åç彿°å½¢åã
è³å°æä¸ä¸ªå½¢åå çæ¨¡æ¿è¢«ç§°ä½å忍¡æ¿ã
è¯æ³
模æ¿å½¢åå ï¼åºç°äºå«å模çã类模æ¿ãå鿍¡æ¿å彿°æ¨¡æ¿å½¢åå表ä¸ï¼
ç±»å ... Args(å¯é)
|
(1) | ||||||||
typename|class ... Args(å¯é)
|
(2) | ||||||||
template < å½¢åå表 > typename(C++17)|class ... Args(å¯é)
|
(3) | ||||||||
彿°åæ°å ï¼å£°æç¬¦çä¸ç§å½¢å¼ï¼åºç°äºåå彿°æ¨¡æ¿ç彿°å½¢åå表ä¸ï¼
Args ... args(å¯é)
|
(4) | ||||||||
å½¢åå å±å¼ï¼åºç°äºå忍¡æ¿ä½ä¸ï¼
æ¨¡å¼ ...
|
(5) | ||||||||
æ¨¡å¼ çéå·åéåè¡¨ãæ¨¡å¼å¿
é¡»å
å«è³å°ä¸ä¸ªå½¢åå
ãè§£é
åå类模æ¿å¯ç¨ä»»ææ°éçæ¨¡æ¿å®åå®ä¾åï¼
template<class ... Types> struct Tuple {}; Tuple<> t0; // Types ä¸å å«å®å Tuple<int> t1; // Types å å«ä¸ä¸ªå®åï¼int Tuple<int, float> t2; // Types å å«äºä¸ªå®åï¼int ä¸ float Tuple<0> error; // é误ï¼0 䏿¯ç±»å
åå彿°æ¨¡æ¿å¯ç¨ä»»ææ°éç彿°å®åè°ç¨ï¼æ¨¡æ¿å®åéè¿æ¨¡æ¿å®åæ¨å¯¼æ¨å¯¼ï¼ï¼
template<class ... Types> void f(Types ... args); f(); // OKï¼args ä¸å å«å®å f(1); // OKï¼args å å«ä¸ä¸ªå®åï¼int f(2, 1.0); // OKï¼args å å«äºä¸ªå®åï¼int ä¸ double
å¨ä¸»ç±»æ¨¡æ¿ä¸ï¼æ¨¡æ¿å½¢åå å¿ é¡»æ¯æ¨¡æ¿å½¢åå表çæåä¸ä¸ªå½¢åãå¨å½æ°æ¨¡æ¿ä¸ï¼æ¨¡æ¿åæ°å å¯ä»¥å¨å表ä¸ç¨æ©åºç°ï¼åªè¦å ¶åçææå½¢ååå¯ä»å½æ°å®åæ¨å¯¼ææ¥æé»è®¤å®åå³å¯ï¼
template<typename... Ts, typename U> struct Invalid; // é误ï¼Ts.. ä¸å¨ç»å°¾  template<typename ...Ts, typename U, typename=void> void valid(U, Ts...); // OKï¼è½æ¨å¯¼ U // void valid(Ts..., U); // ä¸è½ä½¿ç¨ï¼Ts... 卿¤ä½ç½®æ¯éæ¨å¯¼è¯å¢  valid(1.0, 1, 2, 3); // OKï¼æ¨å¯¼ U 为 doubleï¼Ts 为 {int,int,int}
å å±å¼
模å¼åéçç¥å·ï¼å ¶ä¸è³å°æä¸ä¸ªå½¢åå çååè³å°åºç°ä¸æ¬¡ï¼å ¶è¢«å±å¼æé¶ææ´å¤ä¸ªéå·åéçæ¨¡å¼å®ä¾ï¼å ¶ä¸å½¢åå çååæé¡ºåºè¢«æ¿æ¢æå ä¸çå个å ç´ ã
template<class ...Us> void f(Us... pargs) {} template<class ...Ts> void g(Ts... args) { f(&args...); // â&args...â æ¯å å±å¼ // â&argsâ æ¯å ¶æ¨¡å¼ } g(1, 0.2, "a"); // Ts... args å±å¼æ int E1, double E2, const char* E3 // &args... å±å¼æ &E1, &E2, &E3 // Us... å±å¼æ int* E1, double* E2, const char** E3
è¥ä¸¤ä¸ªå½¢åå åºç°äºå䏿¨¡å¼ä¸ï¼åå®ä»¬åæ¶å±å¼ï¼èä¸å®ä»¬å¿ é¡»æç¸åé¿åº¦ï¼
template<typename...> struct Tuple {}; template<typename T1, typename T2> struct Pair {};  template<class ...Args1> struct zip { template<class ...Args2> struct with { typedef Tuple<Pair<Args1, Args2>...> type; // Pair<Args1, Args2>... æ¯å å±å¼ // Pair<Args1, Args2> æ¯æ¨¡å¼ }; };  typedef zip<short, int>::with<unsigned short, unsigned>::type T1; // Pair<Args1, Args2>... å±å¼æ // Pair<short, unsigned short>, Pair<int, unsigned int> // T1 æ¯ Tuple<Pair<short, unsigned short>, Pair<int, unsigned>>  typedef zip<short>::with<unsigned short, unsigned>::type T2; // é误ï¼å å±å¼ä¸å å«ä¸åé¿åº¦çå½¢åå
è¥å å±å¼å åµäºå¦ä¸å å±å¼ä¸ï¼åå ¶æå±å¼çæ¯åºç°äºæå å±å å±å¼çå½¢åå ï¼å¹¶ä¸å¿ é¡»å¨å¤å´ï¼èéæå å±ï¼çå å±å¼ä¸å¿ é¡»æåå¦ä¸ä¸ªå ï¼
template<class ...Args> void g(Args... args) { f(const_cast<const Args*>(&args)...); // const_cast<const Args*>(&args) æ¯æ¨¡å¼ï¼å®åæ¶å±å¼ä¸¤ä¸ªå ï¼Args ä¸ argsï¼ Â f(h(args...) + args...); // åµå¥å å±å¼ï¼ // å å±å å±å¼æ¯âargs...âï¼å®é¦å å±å¼ // å¤å±å å±å¼æ¯ h(E1, E2, E3) + args å®è¢«ç¬¬äºæ¬¡å±å¼ // ï¼æä¸º h(E1,E2,E3) + E1, h(E1,E2,E3) + E2, h(E1,E2,E3) + E3ï¼ }
å±å¼åºæ
åå³äºåçå±å¼çåºæï¼å ¶æäº§ççéå·åéå表å¯ä»¥æ¯ä¸åç§ç±»çå表ï¼å½æ°å½¢ååè¡¨ï¼æååå§åå¨å表ï¼å±æ§å表ï¼ççã以ä¸ååºäºææå 许çè¯å¢ã
彿°å®åå表
å å±å¼å¯ä»¥åºç°å¨å½æ°è°ç¨è¿ç®ç¬¦çæ¬å·å ï¼æ¤æ åµä¸çç¥å·å·¦ä¾§çæå¤§è¡¨è¾¾å¼æè±æ¬å·åå§åå¨å表æ¯è¢«å±å¼ç模å¼ã
f(&args...); // å±å¼æ f(&E1, &E2, &E3) f(n, ++args...); // å±å¼æ f(n, ++E1, ++E2, ++E3); f(++args..., n); // å±å¼æ f(++E1, ++E2, ++E3, n); f(const_cast<const Args*>(&args)...); // f(const_cast<const E1*>(&X1), const_cast<const E2*>(&X2), const_cast<const E3*>(&X3)) f(h(args...) + args...); // å±å¼æ // f(h(E1,E2,E3) + E1, h(E1,E2,E3) + E2, h(E1,E2,E3) + E3)
æ£å¼èè¨ï¼å½æ°è°ç¨è¡¨è¾¾å¼ä¸ç表达å¼å表被å½ç±»ä¸ºåå§åå¨å表ï¼å ¶æ¨¡å¼æ¯åå§åå¨åå¥ï¼å®ææ¯èµå¼è¡¨è¾¾å¼ï¼ææ¯è±æ¬å·åå§åå¨å表ã
ææ¬å·åå§åå¨
å å±å¼å¯åºç°äºç´æ¥åå§åå¨ï¼å½æ°å¼è½¬ååå ¶ä»è¯å¢ï¼æååå§åå¨ï¼new 表达å¼çï¼çæ¬å·ä¹å ï¼è¿ç§æ åµä¸çè§åä¸éç¨äºä¸è¿°å½æ°è°ç¨è¡¨è¾¾å¼çè§åç¸åï¼
Class c1(&args...); // è°ç¨ Class::Class(&E1, &E2, &E3) Class c2 = Class(n, ++args...); // è°ç¨ Class::Class(n, ++E1, ++E2, ++E3); ::new((void *)p) U(std::forward<Args>(args)...) // std::allocator::allocate
è±æ¬å·å å´çåå§åå¨
å¨è±æ¬å·åå§åå¨å表ï¼è±æ¬å·å å´çåå§åå¨åå ¶ä»è±æ¬å·åå§åå¨å表çå表ï¼ç¨äºå表åå§ååå ¶ä»ä¸äºè¯å¢ä¸ï¼ä¸ï¼ä¹å¯ä»¥åºç°å å±å¼ï¼
template<typename... Ts> void func(Ts... args){ const int size = sizeof...(args) + 2; int res[size] = {1,args...,2}; // å 为åå§åå¨å表ä¿è¯é¡ºåºï¼æä»¥è¿å¯ç¨äºæé¡ºåºå¯¹å çæ¯ä¸ªå ç´ è°ç¨å½æ°ï¼ int dummy[sizeof...(Ts)] = { (std::cout << args, 0)... }; }
模æ¿å®åå表
å å±å¼å¯ç¨äºæ¨¡æ¿å½¢åå表çä»»ä½ä½ç½®ï¼åææ¯æ¨¡æ¿æ¥æä¸è¯¥å±å¼ç¸å¹é çå½¢åã
template<class A, class B, class...C> void func(A arg1, B arg2, C...arg3) { container<A,B,C...> t1; // å±å¼æ container<A,B,E1,E2,E3> container<C...,A,B> t2; // å±å¼æ container<E1,E2,E3,A,B> container<A,C...,B> t3; // å±å¼æ container<A,E1,E2,E3,B> }
彿°å½¢åå表
å¨å½æ°å½¢åå表ä¸ï¼è¥çç¥å·åºç°äºæä¸ªå½¢å声æä¸ï¼æ è®ºå®æ¯å¦æå彿°å½¢åå
ï¼ä¾å¦å¨ Args ... argsä¸ï¼ï¼ï¼å该形åå£°ææ¯æ¨¡å¼ï¼
template<typename ...Ts> void f(Ts...) {} f('a', 1); // Ts... å±å¼æ void f(char, int) f(0.1); // Ts... å±å¼æ void f(double)  template<typename ...Ts, int... N> void g(Ts (&...arr)[N]) {} int n[1]; g<const char, int>("a", n); // Ts (&...arr)[N] å±å¼æ // const char (&)[2], int(&)[1]
注æï¼å¨æ¨¡å¼ Ts (&...arr)[N] ä¸ï¼çç¥å·æ¯æå
å±å
ç´ ï¼èé妿æå
¶ä»å
å±å¼ä¸ä¸æ ·ä¸ºå
¶æåå
ç´ ã
注æï¼Ts (&...)[N] ä¸è¢«å
许ï¼å 为 C++11 è¯æ³è¦æ±å¸¦æ¬å·ççç¥å·å½¢åæ¥æååï¼CWG #1488ã
模æ¿å½¢åå表
å å±å¼å¯ä»¥åºç°äºæ¨¡æ¿å½¢åå表ä¸ï¼
template<typename... T> struct value_holder { template<T... Values> // å±å¼æéç±»åæ¨¡æ¿å½¢ååè¡¨ï¼ struct apply { }; // ä¾å¦ <int, char, int(&)[5]> };
åºç±»è¯´æç¬¦ä¸æååå§åå¨å表
å å±å¼å¯ä»¥ç¨äºæå®ç±»å£°æä¸çåºç±»å表ãå ¸åæ åµä¸ï¼è¿ä¹æå³çå ¶æé 彿°ä¹éè¦å¨æååå§åå¨å表ä¸ä½¿ç¨å å±å¼ï¼ä»¥è°ç¨è¿äºåºç±»çæé 彿°ï¼
template<class... Mixins> class X : public Mixins... { public: X(const Mixins&... mixins) : Mixins(mixins)... { } };
Lambda ä¿è·
å å±å¼å¯ä»¥åºç°äº lambda 表达å¼çä¿è·åå¥ä¸
template<class ...Args> void f(Args... args) { auto lm = [&, args...] { return g(args...); }; lm(); }
sizeof... è¿ç®ç¬¦
sizeof... ä¹è¢«å½ç±»ä¸ºå å±å¼
template<class... Types> struct count { static const std::size_t value = sizeof...(Types); };
卿å¼å¸¸è¯´æå¨æå¼å¸¸è¯´æä¸çå¼å¸¸å表亦å¯ä¸ºå å±å¼ template<class...X> void func(int arg) throw(X...) { // ... å¨ä¸åæ 形䏿åºä¸åç X } |
(C++17 å) |
对é½è¯´æç¬¦
å å±å¼å 许å¨å ³é®è¯ alignas æç¨çç±»åå表å表达å¼å表ä¸ä½¿ç¨
屿§å表
å å±å¼å 许å¨å±æ§å表ä¸ä½¿ç¨ï¼å¦ [[attributes...]]ãä¾å¦ï¼void [[attributes...]] function()
æå 表达å¼å¨æå 表达å¼ä¸ï¼æ¨¡å¼æ¯ä¸å 嫿ªå±å¼å½¢åå çæ´ä¸ªå表达å¼ã using 声æå¨ using 声æä¸ï¼çç¥å·å¯ä»¥åºç°äºå£°æå¨å表å ï¼è¿å¯¹äºä»ä¸ä¸ªå½¢åå è¿è¡æ´¾çæ¶æç¨ï¼ template <typename... bases> struct X : bases... { using bases::g...; }; X<B, D> x; // OKï¼å¼å ¥ B::g ä¸ D::g |
(C++17 èµ·) |
注解
| æ¬èæªå®æ åå ï¼å ³äºé¨åç¹ååå ¶ä»è®¿é®åç¬å ç´ æ¹å¼çä¸äºè¯ï¼æåéå½ vs å¯¹æ° vs çè·¯ï¼ä¾å¦æå è¡¨è¾¾å¼ |
示ä¾
#include <iostream>  void tprintf(const char* format) // åºç¡å½æ° { std::cout << format; }  template<typename T, typename... Targs> void tprintf(const char* format, T value, Targs... Fargs) // éå½åå彿° { for ( ; *format != '\0'; format++ ) { if ( *format == '%' ) { std::cout << value; tprintf(format+1, Fargs...); // éå½è°ç¨ return; } std::cout << *format; } }  int main() { tprintf("% world% %\n","Hello",'!',123); return 0; }
è¾åºï¼
Hello world! 123
ä¸è¿°ä¾åå®ä¹äºç±»ä¼¼ std::printf ç彿°ï¼å¹¶ä»¥ä¸ä¸ªå¼æ¿æ¢æ ¼å¼å符串ä¸å符 % çæ¯æ¬¡åºç°ã
é¦ä¸ªéè½½å¨ä» ä¼ éæ ¼å¼åç¬¦ä¸²ä¸æ å½¢åå±å¼æ¶è°ç¨ã
第äºä¸ªéè½½ä¸åå«å å«é对å®å头çä¸ä¸ªæ¨¡æ¿å½¢ååä¸ä¸ªå½¢åå ï¼è¿å 许éå½è°ç¨ä¸ä» ä¼ éå½¢åçå°¾é¨ï¼ç´å°å®å为空ã
Targs æ¯æ¨¡æ¿å½¢åå
è Fargs æ¯å½æ°å½¢åå
åé
| 彿°æ¨¡æ¿ | |
| ç±»æ¨¡æ¿ | |
| sizeof... | æ¥è¯¢å½¢åå ä¸çå ç´ æ°éã |
| C 飿 ¼çåå彿° | |
| é¢å¤çå¨å® | 亦å¯ä¸ºåå |
| æå è¡¨è¾¾å¼ | |