C++ åèæå
- C++11
- C++14
- C++17
- C++20
- C++ ç¼è¯å¨æ¯ææ åµè¡¨
- ç¬ç«ä¸å®¿ä¸»å®ç°
- C++ è¯è¨
- C++ å ³é®è¯
- é¢å¤çå¨
- C++ æ ååºå¤´æä»¶
- å ·åè¦æ±
- åè½ç¹æ§æµè¯ (C++20)
- å·¥å ·åº
- ç±»åæ¯æï¼åºæ¬ç±»åãRTTIãç±»åç¹æ§ï¼
- æ¦å¿µåº (C++20)
- é误å¤ç
- 卿å å管ç
- æ¥æåæ¶é´å·¥å ·
- å符串åº
- 容å¨åº
- std::array
- std::array<T,N>::at
- std::array<T,N>::operator[]
- std::array<T,N>::front
- std::array<T,N>::back
- std::array<T,N>::data
- std::array<T,N>::begin, std::array<T,N>::cbegin
- std::array<T,N>::fill
- std::array<T,N>::end, std::array<T,N>::cend
- std::array<T,N>::rbegin, std::array<T,N>::crbegin
- std::array<T,N>::rend, std::array<T,N>::crend
- std::array<T,N>::empty
- std::array<T,N>::size
- std::array<T,N>::max_size
- std::array<T,N>::swap
- std::get(std::array)
- std::swap(std::array)
- std::to_array
- operator==,!=,<,<=,>,>=,<=>(std::array)
- std::tuple_size(std::array)
- std::tuple_element<std::array>
- std::array çæ¨å¯¼æå¼
- std::vector
- std::map
- std::unordered_map
- std::priority_queue
- std::span
- std::forward_list
- std::deque
- std::list
- std::set
- std::multiset
- std::multimap
- std::unordered_set
- std::unordered_multiset
- std::unordered_multimap
- std::stack
- std::queue
- std::vector<bool>
- ç»ç¹ææ (C++17)
- 注é
- è¿ä»£å¨åº
- èå´åº (C++20)
- ç®æ³åº
- æ°å¼åº
- è¾å ¥/è¾åºåº
- æä»¶ç³»ç»åº
- æ¬å°ååº
- æ£å表达å¼åº
- ååæä½åº
- çº¿ç¨æ¯æåº
- å®éªæ§ C++ ç¹æ§
- æç¨çèµæº
- ç´¢å¼
- std 符å·ç´¢å¼
- åç¨æ¯æ (C++20)
- C++ å ³é®è¯
ä½ç½®ï¼é¦é¡µ > C++ åèæå >容å¨åº >std::array > std::to_array
std::to_array
| å®ä¹äºå¤´æä»¶ <array>
|
||
| template<class T, std::size_t N> constexpr std::array<std::remove_cv_t<T>, N> to_array(T (&a)[N]); |
(1) | (C++20 èµ·) |
| template<class T, std::size_t N> constexpr std::array<std::remove_cv_t<T>, N> to_array(T (&&a)[N]); |
(2) | (C++20 èµ·) |
ä»ä¸ç»´å
建æ°ç» a å建 std::array ãä» a ç对åºå
ç´ å¤å¶åå§å std::array çå
ç´ ã䏿¯æå¤å¶æç§»å¨å¤ç»´å
建æ°ç»ã
1) 对
0, ..., N - 1 ä¸çæ¯ä¸ª i ï¼ä»¥ a[i] å¤å¶åå§åç»æç对åºå
ç´ ãè¥ std::is_constructible_v<T, T&> 为 false 忤é载为ç
å¼ã2) 对
0, ..., N - 1 ä¸çæ¯ä¸ª i ï¼ä»¥ std::move(a[i]) å¤å¶åå§åç»æç对åºå
ç´ ãè¥ std::is_move_constructible_v<T> 为 false 忤é载为ç
å¼ãstd::is_array_v<T> 为 true æ¶ä¸¤ä¸ªéè½½å为ç å¼ã
åæ°
| a | - | è¦è½¬æ¢æ std::array çå 建æ°ç» |
| ç±»åè¦æ± | ||
- 为使ç¨éè½½ (1) ï¼ T å¿
须满足å¯å¤å¶æé (CopyConstructible) çè¦æ±ã
| ||
- 为使ç¨éè½½ (2) ï¼ T å¿
须满足å¯ç§»å¨æé (MoveConstructible) çè¦æ±ã
| ||
è¿åå¼
1) std::array<std::remove_cv_t<T>, N>{ a[0], ..., a[N - 1] }
2) std::array<std::remove_cv_t<T>, N>{ std::move(a[0]), ..., std::move(a[N - 1]) }
注解
æä¸äºä¸è½ä½¿ç¨ std::array ç类模æ¿å®åæ¨å¯¼è to_array å¯ç¨çæ
åµï¼
-
to_arrayè½å¨æå·¥æå®std::arrayçå ç´ ç±»åå¹¶æ¨å¯¼é¿åº¦æ¶æå®ï¼è¿å¨æ³è¦éå¼è½¬æ¢æ¶ä¼æ´å¥½ã -
to_arrayè½èµå¼å符串åé¢éï¼è类模æ¿å®åæ¨å¯¼å建æä¸ä¸ªæåå ¶é¦å符çstd::arrayã
std::to_array<long>({3, 4}); // OK ï¼éå¼è½¬æ¢ // std::array<long>{3, 4}; // éè¯¯ï¼æ¨¡æ¿åæ°å¤ªå° std::to_array("foo"); // å建 std::array<char, 4>{ 'f', 'o', 'o', '\0' } std::array{"foo"}; // å建 std::array<const char*, 1>{ +"foo" }
å¯è½çå®ç°
| çæ¬ä¸ |
|---|
namespace detail { Â template <class T, std::size_t N, std::size_t... I> constexpr std::array<std::remove_cv_t<T>, N> to_array_impl(T (&a)[N], std::index_sequence<I...>) { return { {a[I]...} }; } Â } Â template <class T, std::size_t N> constexpr std::array<std::remove_cv_t<T>, N> to_array(T (&a)[N]) { return detail::to_array_impl(a, std::make_index_sequence<N>{}); } |
| çæ¬äº |
namespace detail { Â template <class T, std::size_t N, std::size_t... I> constexpr std::array<std::remove_cv_t<T>, N> to_array_impl(T (&&a)[N], std::index_sequence<I...>) { return { {std::move(a[I])...} }; } Â } Â template <class T, std::size_t N> constexpr std::array<std::remove_cv_t<T>, N> to_array(T (&&a)[N]) { return detail::to_array_impl(std::move(a), std::make_index_sequence<N>{}); } |
示ä¾
è¿è¡æ¤ä»£ç
#include <type_traits> #include <utility> #include <array> #include <memory>  int main() { // å¤å¶å符串åé¢é auto a1 = std::to_array("foo"); static_assert(a1.size() == 4);  // æ¨å¯¼å ç´ ç±»ååé¿åº¦ auto a2 = std::to_array({ 0, 2, 1, 3 }); static_assert(std::is_same_v<decltype(a2), std::array<int, 4>>);  // æ¨å¯¼é¿åº¦èå ç´ ç±»åæå® // åçéå¼è½¬æ¢ auto a3 = std::to_array<long>({ 0, 1, 3 }); static_assert(std::is_same_v<decltype(a3), std::array<long, 3>>);  auto a4 = std::to_array<std::pair<int, float>>( { { 3, .0f }, { 4, .1f }, { 4, .1e23f } }); static_assert(a4.size() == 3);  // å建ä¸å¯å¤å¶ç std::array auto a5 = std::to_array({ std::make_unique<int>(3) }); static_assert(a5.size() == 1);  // é误ï¼ä¸æ¯æå¤å¶å¤ç»´æ°ç» // char s[2][6] = { "nice", "thing" }; // auto a6 = std::to_array(s); }
åé
| å建 std::array 对象ï¼ä»åæ°æ¨å¯¼åºå
¶å¤§å°åå¯éçå
ç´ ç±»å (彿°æ¨¡æ¿) |