std::ranges::views::single, std::ranges::single_view
| Definiert in der Header-Datei <ranges> |
||
| (1) | ||
template< std::copy_constructible T > requires std::is_object_v<T> |
(seit C++20) (bis C++23) |
|
| template< std::move_constructible T > requires std::is_object_v<T> |
(seit C++23) | |
| namespace views { inline constexpr /* unspecified */ single = /* unspecified */; |
(2) | (seit C++20) |
| Aufruf-Signatur |
||
| template< class T > requires /* siehe unten */ |
(seit C++20) | |
view, die genau ein Element mit einem angegebenen Wert enthält.Die Lebensdauer des Elements ist an die übergeordnete single_view gebunden. Das Kopieren einer single_view erstellt eine Kopie des Elements.
Inhalt |
Customization Point Objects
Der Name views::single bezeichnet ein Customization Point Object, das ein konstantes Funktionsobjekt eines literalen semiregular-Klassentyps ist. Zu Auslegungszwecken wird die cv-unqualifizierte Version seines Typs als __single_fn bezeichnet.
Alle Instanzen von __single_fn sind gleich. Die Auswirkungen des Aufrufs verschiedener Instanzen vom Typ __single_fn auf dieselben Argumente sind äquivalent, unabhängig davon, ob der die Instanz bezeichnende Ausdruck ein lvalue oder rvalue ist und ob er cv-qualifiziert ist oder nicht (eine volatile-qualifizierte Instanz muss jedoch nicht aufrufbar sein). Somit kann views::single frei kopiert werden und seine Kopien können austauschbar verwendet werden.
Gegeben sei eine Menge von Typen Args.... Wenn std::declval<Args>()... die Anforderungen für Argumente an views::single erfüllen, dann modelliert __single_fn
- std::invocable<__single_fn, Args...>,
- std::invocable<const __single_fn, Args...>,
- std::invocable<__single_fn&, Args...>
- std::invocable<const __single_fn&, Args...>.
Andernfalls nimmt kein Funktionsoperator von __single_fn an der Überladungsauflösung teil.
[bearbeiten] Datenmember
| Mitglied | Definition |
copyable-box <T> value_ (bis C++23) |
das einzelne Element der View ((exposition-only member object*) |
movable-box <T> value_ (seit C++23) |
das einzelne Element der View ((exposition-only member object*) |
[bearbeiten] Memberfunktionen
konstruiert eine single_view(öffentliche Memberfunktion) | |
| gibt einen Zeiger auf das Element zurück (öffentliche Memberfunktion) | |
| gibt einen Zeiger hinter das Element zurück (öffentliche Memberfunktion) | |
| [static] |
gibt false zurück (öffentliche statische Memberfunktion) |
| [static] |
gibt 1 zurück (öffentliche statische Memberfunktion) |
| gibt einen Zeiger auf das Element zurück (öffentliche Memberfunktion) | |
Geerbt von std::ranges::view_interface | |
| (C++23) |
gibt einen konstanten Iterator zum Anfang des Bereichs zurück (public member function of std::ranges::view_interface<D>) |
| (C++23) |
gibt ein Sentinel für den konstanten Iterator des Bereichs zurück (public member function of std::ranges::view_interface<D>) |
| gibt zurück, ob die abgeleitete Ansicht nicht leer ist, bereitgestellt nur, wenn ranges::empty darauf anwendbar ist (public member function of std::ranges::view_interface<D>) | |
gibt das erste Element in der abgeleiteten View zurück, bereitgestellt, wenn sie forward_range erfüllt(öffentliche Member-Funktion von std::ranges::view_interface<D>) | |
gibt das letzte Element in der abgeleiteten View zurück, nur bereitgestellt, wenn sie bidirectional_range und common_range erfüllt(öffentliche Member-Funktion von std::ranges::view_interface<D>) | |
gibt das n-te Element in der abgeleiteten View zurück, nur bereitgestellt, wenn sie random_access_range erfüllt(öffentliche Member-Funktion von std::ranges::view_interface<D>) | |
std::ranges::single_view::single_view
| single_view() requires std::default_initializable<T> = default; |
(1) | (seit C++20) |
| (2) | ||
constexpr explicit single_view( const T& t ); |
(seit C++20) (bis C++23) |
|
| constexpr explicit single_view( const T& t ) requires std::copy_constructible<T>; |
(seit C++23) | |
| constexpr explicit single_view( T&& t ); |
(3) | (seit C++20) |
| template< class... Args > requires std::constructible_from<T, Args...> |
(4) | (seit C++20) |
Konstruiert eine single_view.
value_ standardmäßig, was seinen enthaltenen Wert wertinitialisiert.value_ mit t.value_ mit std::move(t).
std::ranges::single_view::begin
| constexpr T* begin() noexcept; constexpr const T* begin() const noexcept; |
(seit C++20) | |
Entspricht return data();.
std::ranges::single_view::end
| constexpr T* end() noexcept; constexpr const T* end() const noexcept; |
(seit C++20) | |
Entspricht return data() + 1;.
std::ranges::single_view::empty
| static constexpr bool empty() noexcept; |
(seit C++20) | |
Entspricht return false;.
std::ranges::single_view::size
| static constexpr std::size_t size() noexcept; |
(seit C++20) | |
Entspricht return 1;.
Macht single_view zu einem /*tiny-range*/, wie von split_view gefordert.
std::ranges::single_view::data
| constexpr T* data() noexcept; constexpr const T* data() const noexcept; |
(seit C++20) | |
Gibt einen Zeiger auf den enthaltenen Wert von value_ zurück. Das Verhalten ist undefiniert, wenn value_ keinen Wert enthält.
[bearbeiten] Deduktionshilfen
| template< class T > single_view( T ) -> single_view<T>; |
(seit C++20) | |
[bearbeiten] Hinweise
Für eine single_view gibt die geerbte Memberfunktion empty immer false zurück und die geerbte Konvertierungsfunktion operator bool gibt immer true zurück.
[bearbeiten] Beispiel
#include <iomanip> #include <iostream> #include <ranges> #include <string> #include <tuple> int main() { constexpr std::ranges::single_view sv1{3.1415}; // uses (const T&) constructor static_assert(sv1); static_assert(not sv1.empty()); std::cout << "1) *sv1.data(): " << *sv1.data() << '\n' << "2) *sv1.begin(): " << *sv1.begin() << '\n' << "3) sv1.size(): " << sv1.size() << '\n' << "4) distance: " << std::distance(sv1.begin(), sv1.end()) << '\n'; std::string str{"C++20"}; std::cout << "5) str = " << std::quoted(str) << '\n'; std::ranges::single_view sv2{std::move(str)}; // uses (T&&) constructor std::cout << "6) *sv2.data(): " << std::quoted(*sv2.data()) << '\n' << "7) str = " << std::quoted(str) << '\n'; std::ranges::single_view<std::tuple<int, double, std::string>> sv3{std::in_place, 42, 3.14, "😄"}; // uses (std::in_place_t, Args&&... args) std::cout << "8) sv3 holds a tuple: { " << std::get<0>(sv3[0]) << ", " << std::get<1>(sv3[0]) << ", " << std::get<2>(sv3[0]) << " }\n"; }
Ausgabe
1) *sv1.data(): 3.1415
2) *sv1.begin(): 3.1415
3) sv1.size(): 1
4) distance: 1
5) str = "C++20"
6) *sv2.data(): "C++20"
7) str = ""
8) sv3 holds a tuple: { 42, 3.14, 😄 }[bearbeiten] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 3428 | C++20 | single_view war von std::in_place_t konvertierbar |
der Konstruktor wurde explizit gemacht |
| LWG 4035 | C++20 | single_view stellte die Memberfunktion empty() nicht bereit |
stellt empty() bereit |
| P2367R0 | C++20 | Deduktionshilfen für single_view zerlegten das Argument nicht;views::single kopierte, wickelte aber keine single_view ein |
eine zerlegende Hilfe bereitgestellt; immer einwickelnd gemacht |
[bearbeiten] Siehe auch
| (C++17) |
ein Wrapper, der möglicherweise ein Objekt enthält oder auch nicht (Klassenvorlage) |
eine leere view ohne Elemente(class template) (variable template) | |
ein view über die Unterbereiche, die durch Aufteilen eines anderen view mit einem Trennzeichen gebildet werden(Klassen-Template) (Range-Adaptor-Objekt) |