C++ åèæå
- C++11
- C++14
- C++17
- C++20
- C++ ç¼è¯å¨æ¯ææ åµè¡¨
- ç¬ç«ä¸å®¿ä¸»å®ç°
- C++ è¯è¨
- C++ å ³é®è¯
- é¢å¤çå¨
- C++ æ ååºå¤´æä»¶
- å ·åè¦æ±
- åè½ç¹æ§æµè¯ (C++20)
- å·¥å ·åº
- ç¨åºæ¯æå·¥å ·
- std::initializer_list
- 彿°å¯¹è±¡
- std::hash
- std::pair
- std::tuple
- std::optional
- std::any
- std::variant
- std::hash <std::variant>
- std::variant<Types...>::operator=
- std::variant<Types...>::variant
- std::variant<Types...>::~variant
- std::variant<Types...>::index
- std::variant<Types...>::valueless_by_exception
- std::variant<Types...>::emplace
- std::variant<Types...>::swap
- std::visit
- std::holds_alternative
- std::get (std::variant)
- std::get_if
- operator==, !=, <, <=, >, >=, <=>(std::variant)
- std::swap(std::variant)
- std::monostate
- std::bad_variant_access
- std::variant_size, std::variant_size_v
- std::variant_alternative, std::variant_alternative_t
- std::variant_npos
- std::apply
- åºç¹æ§æµè¯å® (C++20)
- æ ¼å¼ååº (C++20)
- std::integer_sequence
- std::exchange
- std::make_from_tuple
- std::launder
- std::to_chars
- std::from_chars
- std::as_const
- std::source_location
- å忰彿°
- std::bitset
- std::cmp_equal, cmp_not_equal, cmp_less, cmp_greater, cmp_less_equal, cmp_greater_equal
- std::in_range
- std::declval
- std::forward
- std::move
- std::move_if_noexcept
- std::chars_format
- std::piecewise_construct_t
- std::piecewise_construct
- std::in_place, std::in_place_type, std::in_place_index, std::in_place_t, std::in_place_type_t, std::in_place_index_t
- 注é
- ç±»åæ¯æï¼åºæ¬ç±»åãRTTIãç±»åç¹æ§ï¼
- æ¦å¿µåº (C++20)
- é误å¤ç
- 卿å å管ç
- æ¥æåæ¶é´å·¥å ·
- å符串åº
- 容å¨åº
- è¿ä»£å¨åº
- èå´åº (C++20)
- ç®æ³åº
- æ°å¼åº
- è¾å ¥/è¾åºåº
- æä»¶ç³»ç»åº
- æ¬å°ååº
- æ£å表达å¼åº
- ååæä½åº
- çº¿ç¨æ¯æåº
- å®éªæ§ C++ ç¹æ§
- æç¨çèµæº
- ç´¢å¼
- std 符å·ç´¢å¼
- åç¨æ¯æ (C++20)
- C++ å ³é®è¯
ä½ç½®ï¼é¦é¡µ > C++ åèæå >å·¥å ·åº > std::variant
std::variant
| å®ä¹äºå¤´æä»¶ <variant>
|
||
| template <class... Types> class variant; |
(C++17 èµ·) | |
ç±»æ¨¡æ¿ std::variant 表示ä¸ä¸ªç±»åå®å
¨çèåä½ã std::variant çä¸ä¸ªå®ä¾å¨ä»»ææ¶å»è¦ä¹ä¿æå
¶ä¸ä¸ªå¯éç±»åä¹ä¸çå¼ï¼è¦ä¹å¨é误æ
åµä¸æ å¼ï¼æ¤ç¶æé¾ä»¥è¾¾æï¼è§ valueless_by_exception ï¼ã
ä¸èåä½å¨èååå§åä¸çè¡ä¸ºä¸è´, è¥ variant ä¿ææä¸ªå¯¹è±¡ç±»å T çå¼ï¼åç´æ¥äº variant ç对象表示ä¸åé
T ç对象表示ãä¸å
许 variant åé
é¢å¤çï¼å¨æï¼å
åã
variant ä¸å®¹è®¸ä¿æå¼ç¨ãæ°ç»ï¼æç±»å void ã空 variant 亦为ç
å¼ï¼å¯ç¨ std::variant<std::monostate> 代æ¿ï¼ã
variant å®¹è®¸ä¿æåä¸ç±»åå¤äºä¸æ¬¡ï¼èä¸å¯ä¿æåä¸ç±»åçä¸å cv éå®çæ¬ã
åèåä½ï¼é»è®¤æé ç variant ä¿æå
¶é¦ä¸ªé项çå¼ï¼é¤é该é项䏿¯å¯é»è®¤æé çï¼è¯¥æ
åµä¸ variant 亦éå¯é»è®¤æé ï¼è½ç¨è¾
å©ç±» std::monostate 使è¿ç§ variant å¯é»è®¤æé ï¼ã
模æ¿å½¢å
| Types | - | å¯åå¨äºæ¤ variant ä¸çç±»åãææç±»åå¿
é¡»æ»¡è¶³å¯ææ (Destructible) è¦æ±ï¼ç¹å«æ¯ä¸å
许æ°ç»ç±»ååé对象类åï¼ã
|
æå彿°
æé variant 对象 (å ¬å¼æå彿°) | |
ææ variant åå
¶æå«çå¼ (å ¬å¼æå彿°) | |
èµå¼ variant (å ¬å¼æå彿°) | |
è§å¯å¨ | |
è¿å variant æä¿æå¯é项çé¶åºä¸æ (å ¬å¼æå彿°) | |
æ£æ¥ variant æ¯å¦å¨éæ³ç¶æ (å ¬å¼æå彿°) | |
ä¿®æ¹å¨ | |
å使é variant ä¸çå¼ (å ¬å¼æå彿°) | |
ä¸å¦ä¸ variant äº¤æ¢ (å ¬å¼æå彿°) | |
éæå彿°
| (C++17) |
以䏿å¤ä¸ª variant æä¿æçåå®åè°ç¨ææä¾ç彿°å¯¹è±¡ (彿°æ¨¡æ¿) |
| (C++17) |
æ£æ¥æä¸ª variant æ¯å¦å½åæææä¸ªç»å®ç±»å (彿°æ¨¡æ¿) |
| (C++17) |
以ç»å®ç´¢å¼æç±»åï¼è¥ç±»åå¯ä¸ï¼è¯»å variant çå¼ï¼éè¯¯æ¶æåºå¼å¸¸ (彿°æ¨¡æ¿) |
| (C++17) |
以ç»å®ç´¢å¼æç±»åï¼è¥å
¶å¯ä¸ï¼ï¼è·å¾æå被æåç variant çå¼çæéï¼é误æ¶è¿å空æé (彿°æ¨¡æ¿) |
| (C++17)(C++17)(C++17)(C++17)(C++17)(C++17)(C++20) |
以æå«å¼æ¯è¾ variant 对象 (彿°æ¨¡æ¿) |
| (C++17) |
ç¹å std::swap ç®æ³ (彿°) |
è¾ å©ç±»
| (C++17) |
ç¨ä½éå¯é»è®¤æé ç±»åç variant çé¦ä¸ªå¯é项çå ä½ç¬¦ç±»å (ç±») |
| (C++17) |
éæ³å°è®¿é® variant ç弿¶æåºçå¼å¸¸ (ç±») |
| (C++17) |
å¨ç¼è¯æ¶è·å¾ variant å¯é项å表çå¤§å° (类模æ¿) (å鿍¡æ¿) |
| å¨ç¼è¯æ¶è·å¾ä»¥å
¶ä¸æ æå®çå¯é项çç±»å (类模æ¿) (å«å模æ¿) | |
| (C++17) |
ç¹å std::hash ç®æ³ (类模æ¿ç¹å) |
è¾ å©å¯¹è±¡
| (C++17) |
éæ³ç¶æç variant ç䏿 (常é) |
ç¼ºé·æ¥å
ä¸åæ´æ¹è¡ä¸ºçç¼ºé·æ¥å追溯å°åºç¨äºä»¥ååºçç C++ æ åã
| DR | åºç¨äº | åºçæ¶çè¡ä¸º | æ£ç¡®è¡ä¸º |
|---|---|---|---|
| LWG 2901 | C++17 | æä¾ std::uses_allocator çç¹åï¼ä½ variant ä¸è½æ£ç¡®æ¯æåé
å¨
|
ç§»é¤ç¹å |
示ä¾
#include <variant> #include <string> #include <cassert>  int main() { std::variant<int, float> v, w; v = 12; // v å« int int i = std::get<int>(v); w = std::get<int>(v); w = std::get<0>(v); // ä¸åä¸è¡ææç¸å w = v; // ä¸åä¸è¡ææç¸å  // std::get<double>(v); // éè¯¯ï¼ [int, float] 䏿 double // std::get<3>(v); // é误ï¼åæ³ä¸æ å¼ä¸º 0 ä¸ 1  try { std::get<float>(w); // w å« int èé float ï¼å°æåº } catch (const std::bad_variant_access&) {}  using namespace std::literals;  std::variant<std::string> x("abc"); // è½¬æ¢æé 彿°å¨æ æ§ä¹æ¶èµ·ä½ç¨ x = "def"; // 转æ¢èµå¼å¨æ æ§ä¹æ¶äº¦èµ·ä½ç¨  std::variant<std::string, void const*> y("abc"); // ä¼ é char const * æ¶è½¬æ¢æ void const * assert(std::holds_alternative<void const*>(y)); // æå y = "xyz"s; assert(std::holds_alternative<std::string>(y)); // æå }
åé
| åä½æé æ ç¾ (类模æ¿) | |
| (C++17 èµ·) |
å¯è½æå¯è½ä¸ä¿æä¸ä¸ªå¯¹è±¡çå
è£
å¨ (类模æ¿) |
| (C++17 èµ·) |
å¯ä¿æä»»ä½å¯å¤å¶æé (CopyConstructible) ç±»åçå®ä¾ç对象ã (ç±») |