C++ åèæå
- C++11
- C++14
- C++17
- C++20
- C++ ç¼è¯å¨æ¯ææ åµè¡¨
- ç¬ç«ä¸å®¿ä¸»å®ç°
- C++ è¯è¨
- C++ å ³é®è¯
- é¢å¤çå¨
- C++ æ ååºå¤´æä»¶
- å ·åè¦æ±
- C++ å ·åè¦æ±ï¼ 彿°å¯¹è±¡ (FunctionObject)
- C++ å ·åè¦æ±ï¼ äºå è°è¯ (BinaryPredicate)
- C++ å ·åè¦æ±ï¼ å¯é»è®¤æé (DefaultConstructible)
- C++ å ·åè¦æ±ï¼ å¯å¤å¶èµå¼ (CopyAssignable)
- C++ å ·åè¦æ±ï¼ å¯å¤å¶æé (CopyConstructible)
- C++ å ·åè¦æ±ï¼ å¯ç§»å¨èµå¼ (MoveAssignable) (C++11 èµ·)
- C++ å ·åè¦æ±ï¼ å¯ç§»å¨æé (MoveConstructible) (C++11 èµ·)
- C++ å ·åè¦æ±ï¼ 坿æ (Destructible)
- C++ å ·åè¦æ±ï¼ å¯å¹³å¡å¤å¶ (TriviallyCopyable)
- C++ å ·åè¦æ±ï¼ å¯ç¸çæ¯è¾ (EqualityComparable)
- C++ å ·åè¦æ±ï¼ å¯å°äºæ¯è¾ (LessThanComparable)
- C++ å ·åè¦æ±ï¼ æ¯è¾ (Compare)
- C++ å ·åè¦æ±ï¼ åé¢ç±»å (LiteralType)
- C++ å ·åè¦æ±ï¼ ç®æ§æ°æ®ç±»å (PODType)
- C++ å ·åè¦æ±ï¼ å¹³å¡ç±»å (TrivialType)
- C++ å ·åè¦æ±ï¼ æ åå¸å±ç±»å (StandardLayoutType)
- C++ å ·åè¦æ±ï¼ éçååè¿ä»£å¨ (LegacyForwardIterator)
- C++ å ·åè¦æ±ï¼ å¯äº¤æ¢ (Swappable)
- C++ å ·åè¦æ±ï¼ å¼å¯äº¤æ¢ (ValueSwappable)
- C++ å ·åè¦æ±ï¼ å¯ç©ºæé (NullablePointer) (C++11 èµ·)
- C++ å ·åè¦æ±ï¼ æ£å (Hash)
- C++ å ·åè¦æ±ï¼ åé å¨ (Allocator)
- C++ å ·åè¦æ±ï¼ å¯è°ç¨ (Callable)
- C++ å ·åè¦æ±ï¼ è°è¯ (Predicate)
- C++ å ·åè¦æ±ï¼ å®¹å¨ (Container)
- C++ å ·åè¦æ±ï¼ åºåå®¹å¨ (SequenceContainer)
- C++ å ·åè¦æ±ï¼ è¿ç»å®¹å¨ (ContiguousContainer)
- C++ å ·åè¦æ±ï¼ å¯éå®¹å¨ (ReversibleContainer)
- C++ å ·åè¦æ±ï¼ å ³èå®¹å¨ (AssociativeContainer)
- C++ å ·åè¦æ±ï¼ å ·åé å¨å®¹å¨ (AllocatorAwareContainer)
- C++ å ·åè¦æ±ï¼ æ åºå ³èå®¹å¨ (UnorderedAssociativeContainer)
- C++ å ·åè¦æ±ï¼ å¯é»è®¤æå ¥ (DefaultInsertable)
- C++ å ·åè¦æ±ï¼ å¯å¤å¶æå ¥ (CopyInsertable)
- C++ å ·åè¦æ±ï¼ å¯ç§»å¨æå ¥ (MoveInsertable) (C++11 èµ·)
- C++ å ·åè¦æ±ï¼ å¯å°±ä½æé (EmplaceConstructible) (C++11 èµ·)
- C++ å ·åè¦æ±ï¼ 坿¦é¤ (Erasable)
- C++ å ·åè¦æ±ï¼ éçè¿ä»£å¨ (LegacyIterator)
- C++ å ·åè¦æ±ï¼ éçè¾åºè¿ä»£å¨ (LegacyOutputIterator)
- C++ å ·åè¦æ±ï¼ éçè¾å ¥è¿ä»£å¨ (LegacyInputIterator)
- C++ å ·åè¦æ±ï¼ éçååè¿ä»£å¨ (LegacyBidirectionalIterator)
- C++ å ·åè¦æ±ï¼ éçéæºè®¿é®è¿ä»£å¨ (LegacyRandomAccessIterator)
- C++ å ·åè¦æ±ï¼ éçè¿ç»è¿ä»£å¨ (LegacyContiguousIterator)
- C++ å ·åè¦æ±ï¼ 常é表达å¼è¿ä»£å¨ (ConstexprIterator)
- C++ å ·åè¦æ±ï¼ ææ ¼å¼è¾å ¥å½æ° (FormattedInputFunction)
- C++ å ·åè¦æ±ï¼ æ æ ¼å¼è¾å ¥å½æ° (UnformattedInputFunction)
- C++ å ·åè¦æ±ï¼ ææ ¼å¼è¾åºå½æ° (FormattedOutputFunction)
- C++ å ·åè¦æ±ï¼ æ æ ¼å¼è¾åºå½æ° (UnformattedOutputFunction)
- C++ å ·åè¦æ±ï¼ ç§ååºå (SeedSequence)
- C++ å ·åè¦æ±ï¼ éæºæ°å¼æ (RandomNumberEngine)
- C++ å ·åè¦æ±ï¼ éæºæ°åå¸ (RandomNumberDistribution)
- C++ å ·åè¦æ±ï¼ ååéæºä½çæå¨ (UniformRandomBitGenerator)
- C++ å ·åè¦æ±ï¼ éæºæ°å¼æéé å¨ (RandomNumberEngineAdaptor)
- C++ å ·åè¦æ±ï¼ åºæ¬å¯éå® (BasicLockable)
- C++ å ·åè¦æ±ï¼ å¯éå® (Lockable)
- C++ å ·åè¦æ±ï¼ å¯å®æ¶éå® (TimedLockable)
- C++ å ·åè¦æ±ï¼ äºæ¥ä½ (Mutex)
- C++ å ·åè¦æ±ï¼ 宿¶äºæ¥ä½ (TimedMutex)
- C++ å ·åè¦æ±ï¼ å ±äº«äºæ¥ä½ (SharedMutex)
- C++ å ·åè¦æ±ï¼ å ±äº«å®æ¶äºæ¥ä½ (SharedTimedMutex)
- C++ å ·åè¦æ±ï¼ å符ç¹å¾ (CharTraits)
- C++ å ·åè¦æ±ï¼ æ£å表达å¼ç¹å¾ (RegexTraits)
- C++ å ·åè¦æ±ï¼ 使©ç ç±»å (BitmaskType)
- C++ å ·åè¦æ±ï¼ æ°å¼ç±»å (NumericType)
- C++ å ·åè¦æ±ï¼ ä¸å ç±»åç¹å¾ (UnaryTypeTrait)
- C++ å ·åè¦æ±ï¼ äºå ç±»åç¹å¾ (BinaryTypeTrait)
- C++ å ·åè¦æ±ï¼ 忢ç¹å¾ (TransformationTrait)
- C++ å ·åè¦æ±ï¼ æ¶é (Clock)
- C++ å ·åè¦æ±ï¼ 平塿¶é (TrivialClock)
- 注é
- åè½ç¹æ§æµè¯ (C++20)
- å·¥å ·åº
- ç±»åæ¯æï¼åºæ¬ç±»åãRTTIãç±»åç¹æ§ï¼
- æ¦å¿µåº (C++20)
- é误å¤ç
- 卿å å管ç
- æ¥æåæ¶é´å·¥å ·
- å符串åº
- 容å¨åº
- è¿ä»£å¨åº
- èå´åº (C++20)
- ç®æ³åº
- æ°å¼åº
- è¾å ¥/è¾åºåº
- æä»¶ç³»ç»åº
- æ¬å°ååº
- æ£å表达å¼åº
- ååæä½åº
- çº¿ç¨æ¯æåº
- å®éªæ§ C++ ç¹æ§
- æç¨çèµæº
- ç´¢å¼
- std 符å·ç´¢å¼
- åç¨æ¯æ (C++20)
- C++ å ³é®è¯
ä½ç½®ï¼é¦é¡µ > C++ åèæå >å ·åè¦æ± > C++ å ·åè¦æ±ï¼ å¯è°ç¨ (Callable)
C++ å ·åè¦æ±ï¼ å¯è°ç¨ (Callable)
å¯è°ç¨ (Callable) ç±»åæ¯å¯åºç¨ INVOKE æä½ï¼ä¾å¦ç¨äº std::functionãstd::bind å std::thread::threadï¼çç±»åãæ¤æä½å¯ä»¥ç¨åºå½æ° std::invoke æ¾å¼è¿è¡ã (C++17 èµ·)
è¦æ±
è¥æ»¡è¶³ä¸åæ¡ä»¶ï¼åç±»å T 满足å¯è°ç¨ (Callable)
ç»å®
-
Tç±»åç对象f - éåçå®åç±»åå表
ArgTypes - éåçè¿åç±»å
R
åä¸å表达å¼å¿ 须忳ï¼
| è¡¨è¾¾å¼ | è¦æ± |
|---|---|
| INVOKE<R>(f, std::declval<ArgTypes>()...) | 该表达å¼å¨ä¸æ±å¼è¯å¢ä¸è¯æ |
å
¶ä¸ INVOKE<R>(f, t1, t2, ..., tN)ï¼è¥ R æ¯å¯æ cv éå®ç voidï¼åå®ä¹ä¸º static_cast<void>(INVOKE(f, t1, t2, ..., tN))ï¼å¦å为 INVOKE(f, t1, t2, ..., tN)ï¼éå¼è½¬æ¢æ R
å ¶ä¸ INVOKE(f, t1, t2, ..., tN) å®ä¹å¦ä¸ï¼
- è¥
fæ¯ç±»Tçæå彿°æéï¼
- è¥ std::is_base_of<T, std::remove_reference_t<decltype(t1)>>::value 为 trueï¼å INVOKE(f, t1, t2, ..., tN) çä»·äº (t1.*f)(t2, ..., tN)
- å¦åï¼è¥ std::remove_cvref_t<decltype(t1)> 为 std::reference_wrapper çç¹åï¼å INVOKE(f, t1, t2, ..., tN) çä»·äº (t1.get().*f)(t2, ..., tN) (C++17 èµ·)
- å¦åï¼è¥
t1䏿»¡è¶³åè¿°æ¡ä»¶ï¼å INVOKE(f, t1, t2, ..., tN) çä»·äº ((*t1).*f)(t2, ..., tN)ã
- å¦åï¼è¥ N == 1 ä¸
fæ¯ç±»Tçæ°æ®æåæéï¼
- è¥ std::is_base_of<T, std::remove_reference_t<decltype(t1)>>::value 为 trueï¼å INVOKE(f, t1) çä»·äº t1.*f
- å¦åï¼è¥ std::remove_cvref_t<decltype(t1)> æ¯ std::reference_wrapper çç¹åï¼å INVOKE(f, t1) çä»·äº t1.get().*f (C++17 èµ·)
- å¦åï¼è¥
t1䏿»¡è¶³åè¿°æ¡ä»¶ï¼å INVOKE(f, t1) çä»·äº (*t1).*f
- å¦åï¼INVOKE(f, t1, t2, ..., tN) çä»·äº f(t1, t2, ..., tN)ï¼å³
fæ¯ä¸ä¸ªå½æ°å¯¹è±¡ (FunctionObject) ï¼
注解
å¯¹äºæå彿°æéåæ°æ®æåæéï¼t1 å¯ä»¥æ¯ä¸ä¸ªå¸¸è§æéæä¸ä¸ªéè½½äº operator* çç±»ç对象ï¼ä¾å¦ std::unique_ptr æ std::shared_ptrã
æ°æ®æåæé为å¯è°ç¨ (Callable) ï¼å°½ç®¡å¹¶ä¸åç彿°è°ç¨ã
æ ååº
æ¤å¤ï¼ä¸åæ ååºè®¾æ½æ¥åä»»ä½å¯è°ç¨ (Callable) ç±»åï¼ä¸ä» æ¯å½æ°å¯¹è±¡ (FunctionObject) ï¼
| std::function | |
| std::bind | |
| std::result_of | |
| std::thread::thread | |
| std::call_once | |
| std::async | |
| std::packaged_task | |
| std::reference_wrapper |
ç¼ºé·æ¥å
ä¸åæ´æ¹è¡ä¸ºçç¼ºé·æ¥å追溯å°åºç¨äºä»¥ååºçç C++ æ åã
| DR | åºç¨äº | åºçæ¶çè¡ä¸º | æ£ç¡®è¡ä¸º |
|---|---|---|---|
| LWG 2420 | C++11 | å½ R 为 void æ¶ï¼ç»æå¿ é¡»å¯éå¼è½¬æ¢ä¸º voidï¼è¿æ¯ä¸å¯è½çï¼ | å½ R 为 void æ¶ç»æå¯ä»¥æ¾å¼è½¬æ¢å为 void |
åé
| æ£æ¥ç±»åè½å¦ä»¥ç»å®çå®åç±»åè°ç¨ï¼å¦å以 std::invokeï¼ (类模æ¿) |