C++ åèæå
- C++11
- C++14
- C++17
- C++20
- C++ ç¼è¯å¨æ¯ææ åµè¡¨
- ç¬ç«ä¸å®¿ä¸»å®ç°
- C++ è¯è¨
- C++ å ³é®è¯
- é¢å¤çå¨
- C++ æ ååºå¤´æä»¶
- å ·åè¦æ±
- åè½ç¹æ§æµè¯ (C++20)
- å·¥å ·åº
- std::apply
- åºç¹æ§æµè¯å® (C++20)
- ç¨åºæ¯æå·¥å ·
- std::initializer_list
- 彿°å¯¹è±¡
- std::hash
- std::pair
- std::tuple
- std::optional
- std::any
- std::variant
- æ ¼å¼ååº (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::integer_sequence
std::integer_sequence
| å®ä¹äºå¤´æä»¶ <utility>
|
||
| template< class T, T... Ints > struct integer_sequence; |
(C++14 èµ·) | |
ç±»æ¨¡æ¿ std::integer_sequence 表示ä¸ä¸ªç¼è¯æ¶çæ´æ°åºåãå¨ç¨ä½å½æ°æ¨¡æ¿çå®åæ¶ï¼è½æ¨å¯¼åæ°å
Ints å¹¶å°å®ç¨äºå
å±å¼ã
模æ¿å½¢å
| T | - | ç¨äºåºåå ç´ çæ´æ°ç±»å |
| ...Ints | - | 表示åºåçéç±»åå½¢åå |
æåç±»å
| Â | |
| æåç±»å | å®ä¹ |
value_type
|
T
|
æå彿°
| size [éæ] |
è¿å Ints ä¸çå
ç´ æ° (å ¬å¼éææå彿°) |
std::integer_sequence::size
| static constexpr std::size_t size() noexcept; |
||
è¿å Ints ä¸çå
ç´ æ°ãçä»·äº sizeof...(Ints) ã
åæ°
ï¼æ ï¼
è¿åå¼
Ints ä¸çå
ç´ æ°ã
è¾ å©æ¨¡æ¿
ä¸ºå¸®å© T 为 std::size_t çå¸¸ç¨æ
åµï¼å®ä¹å«åæ¨¡æ¿ std::index_sequence ã
| template<std::size_t... Ints> using index_sequence = std::integer_sequence<std::size_t, Ints...>; |
||
å®ä¹è¾
婿¨¡æ¿ std::make_integer_sequence 以ç®å以 0, 1, 2, ..., N-1 为 Ints å建 std::integer_sequence ä¸ std::index_sequence ï¼
| template<class T, T N> using make_integer_sequence = std::integer_sequence<T, /* a sequence 0, 1, 2, ..., N-1 */ >; |
||
| template<std::size_t N> using make_index_sequence = make_integer_sequence<std::size_t, N>; |
||
è¥ N 为è´åç¨åºä¸ºç
å¼ãè¥ N 为é¶ï¼åæç¤ºç±»å为 integer_sequence<T> ã
å®ä¹è¾
å©ç±»æ¨¡æ¿ std::index_sequence_for ï¼ä»¥è½¬æ¢ä»»ä½ç±»ååæ°å
为åé¿åº¦ç䏿 åºåã
| template<class... T> using index_sequence_for = std::make_index_sequence<sizeof...(T)>; |
||
示ä¾
注æï¼å¦ä¸ç¤ºä¾è§ std::apply ä¸å¯è½çå®ç°ã
#include <tuple> #include <iostream> #include <array> #include <utility>  // è°è¯è¾ å© template<typename T, T... ints> void print_sequence(std::integer_sequence<T, ints...> int_seq) { std::cout << "The sequence of size " << int_seq.size() << ": "; ((std::cout << ints << ' '),...); std::cout << '\n'; }  // è½¬æ¢æ°ç»ä¸º tuple template<typename Array, std::size_t... I> auto a2t_impl(const Array& a, std::index_sequence<I...>) { return std::make_tuple(a[I]...); }  template<typename T, std::size_t N, typename Indices = std::make_index_sequence<N>> auto a2t(const std::array<T, N>& a) { return a2t_impl(a, Indices{}); }  // æ¼äº®å°æå° tuple  template<class Ch, class Tr, class Tuple, std::size_t... Is> void print_tuple_impl(std::basic_ostream<Ch,Tr>& os, const Tuple& t, std::index_sequence<Is...>) { ((os << (Is == 0? "" : ", ") << std::get<Is>(t)), ...); }  template<class Ch, class Tr, class... Args> auto& operator<<(std::basic_ostream<Ch, Tr>& os, const std::tuple<Args...>& t) { os << "("; print_tuple_impl(os, t, std::index_sequence_for<Args...>{}); return os << ")"; }  int main() { print_sequence(std::integer_sequence<unsigned, 9, 2, 5, 1, 9, 1, 6>{}); print_sequence(std::make_integer_sequence<int, 20>{}); print_sequence(std::make_index_sequence<10>{}); print_sequence(std::index_sequence_for<float, std::iostream, char>{});  std::array<int, 4> array = {1,2,3,4};  // è½¬æ¢ array 为 tuple auto tuple = a2t(array); static_assert(std::is_same<decltype(tuple), std::tuple<int, int, int, int>>::value, "");  // æå°å° cout std::cout << tuple << '\n'; }
è¾åºï¼
The sequence of size 7: 9 2 5 1 9 1 6 The sequence of size 20: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 The sequence of size 10: 0 1 2 3 4 5 6 7 8 9 The sequence of size 3: 0 1 2 (1, 2, 3, 4)