Namensräume
Varianten
Aktionen

std::ranges::views::single, std::ranges::single_view

Von cppreference.com
< cpp‎ | ranges
 
 
Bereichsbibliothek
Range-Adaptoren
 
Definiert in der Header-Datei <ranges>
(1)
template< std::copy_constructible T >

    requires std::is_object_v<T>
class single_view

    : public ranges::view_interface<single_view<T>>
(seit C++20)
(bis C++23)
template< std::move_constructible T >

    requires std::is_object_v<T>
class single_view

    : public ranges::view_interface<single_view<T>>
(seit C++23)
namespace views {

    inline constexpr /* unspecified */ single = /* unspecified */;

}
(2) (seit C++20)
Aufruf-Signatur
template< class T >

    requires /* siehe unten */

constexpr /* siehe unten */ single( T&& t );
(seit C++20)
1) Erzeugt eine view, die genau ein Element mit einem angegebenen Wert enthält.
2) Der Ausdruck views::single(e) ist ausdrucksäquivalent zu single_view<std::decay_t<decltype((e))>>(e) für jeden geeigneten Unterausdruck e.

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

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>) [edit]
(C++23)
gibt ein Sentinel für den konstanten Iterator des Bereichs zurück
(public member function of std::ranges::view_interface<D>) [edit]
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>) [edit]
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>) [edit]
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>) [edit]
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>) [edit]

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...>

constexpr explicit single_view( std::in_place_t, Args&&... args );
(4) (seit C++20)

Konstruiert eine single_view.

1) Initialisiert value_ standardmäßig, was seinen enthaltenen Wert wertinitialisiert.
2) Initialisiert value_ mit t.
3) Initialisiert value_ mit std::move(t).
4) Initialisiert value_, als ob durch value_{std::in_place, std::forward<Args>(args)...}.

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) [edit]
eine leere view ohne Elemente
(class template) (variable template)[edit]
ein view über die Unterbereiche, die durch Aufteilen eines anderen view mit einem Trennzeichen gebildet werden
(Klassen-Template) (Range-Adaptor-Objekt)[edit]