名稱空間
變體
操作

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

來自 cppreference.com
< cpp‎ | ranges
 
 
範圍庫 (Ranges library)
範圍介面卡 (Range adaptors)
 
定義於標頭檔案 <ranges>
(1)
template< std::copy_constructible T >

    requires std::is_object_v<T>
class single_view

    : public ranges::view_interface<single_view<T>>
(C++20 起)
(直至 C++23)
template< std::move_constructible T >

    requires std::is_object_v<T>
class single_view

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

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

}
(2) (C++20 起)
呼叫簽名 (Call signature)
template< class T >

    requires /* 見下文 */

constexpr /* see below */ single( T&& t );
(C++20 起)
1) 生成一個恰好包含一個指定值的 view
2) 對於任何合適的子表示式 e,表示式 views::single(e) 表示式等價於 single_view<std::decay_t<decltype((e))>>(e)

元素的生命週期繫結到父 single_view。複製 single_view 會複製元素。

目錄

自定義點物件

名稱 views::single 表示一個定製點物件,它是一個 const 函式物件,型別為 字面量 semiregular 類。為了便於說明,其型別的不帶 cv 限定版本記作 __single_fn

__single_fn 的所有例項均相等。在相同實參上呼叫 __single_fn 型別的不同例項的效果是等價的,無論表示例項的表示式是左值還是右值,以及是否帶 const 限定(然而,不要求 volatile 限定的例項是可呼叫的)。因此,views::single 可以自由複製,並且其副本可以互換使用。

給定一組型別 Args...,如果 std::declval<Args>()... 滿足上述 views::single 的實參要求,則 __single_fn 遵循

否則,__single_fn 的任何函式呼叫運算子都不參與過載決議。

[編輯] 資料成員

成員 定義
copyable-box <T> value_ (直至 C++23) 檢視的單個元素
(僅用於闡釋的成員物件*)
movable-box <T> value_ (自 C++23 起) 檢視的單個元素
(僅用於闡釋的成員物件*)

[編輯] 成員函式

構造一個 single_view
(公開成員函式)
返回指向該元素的指標
(公開成員函式)
返回指向該元素之後的指標
(公開成員函式)
[靜態]
返回 false
(公共靜態成員函式)
[靜態]
返回 1
(公共靜態成員函式)
返回指向該元素的指標
(公開成員函式)
繼承自 std::ranges::view_interface
(C++23)
返回範圍開頭的常量迭代器
(std::ranges::view_interface<D> 的公開成員函式) [編輯]
(C++23)
返回範圍常量迭代器的哨兵
(std::ranges::view_interface<D> 的公開成員函式) [編輯]
返回派生檢視是否非空,僅當 ranges::empty 適用於它時提供
(std::ranges::view_interface<D> 的公開成員函式) [編輯]
返回派生檢視中的第一個元素,如果它滿足 forward_range 則提供
(std::ranges::view_interface<D> 的公開成員函式) [編輯]
返回派生檢視中的最後一個元素,僅當它滿足 bidirectional_rangecommon_range 時提供
(std::ranges::view_interface<D> 的公開成員函式) [編輯]
返回派生檢視中的第 n 個元素,僅當它滿足 random_access_range 時提供
(std::ranges::view_interface<D> 的公開成員函式) [編輯]

std::ranges::single_view::single_view

single_view() requires std::default_initializable<T> = default;
(1) (C++20 起)
(2)
constexpr explicit single_view( const T& t );
(C++20 起)
(直至 C++23)
constexpr explicit single_view( const T& t )
    requires std::copy_constructible<T>;
(C++23 起)
constexpr explicit single_view( T&& t );
(3) (C++20 起)
template< class... Args >

    requires std::constructible_from<T, Args...>

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

構造一個 single_view

1) 預設初始化 value_,它對所包含的值進行值初始化。
2)t 初始化 value_
3)std::move(t) 初始化 value_
4) 初始化 value_,如同透過 value_{std::in_place, std::forward<Args>(args)...}

std::ranges::single_view::begin

constexpr T* begin() noexcept;
constexpr const T* begin() const noexcept;
(C++20 起)

等價於 return data();

std::ranges::single_view::end

constexpr T* end() noexcept;
constexpr const T* end() const noexcept;
(C++20 起)

等價於 return data() + 1;

std::ranges::single_view::empty

static constexpr bool empty() noexcept;
(C++20 起)

等價於 return false;

std::ranges::single_view::size

static constexpr std::size_t size() noexcept;
(C++20 起)

等價於 return 1;

使 single_view 模擬 /*tiny-range*/,以滿足 split_view 的要求。

std::ranges::single_view::data

constexpr T* data() noexcept;
constexpr const T* data() const noexcept;
(C++20 起)

返回指向 value_ 中所包含值的指標。如果 value_ 不包含值,則行為未定義。

[編輯] 推導指引

template< class T >
single_view( T ) -> single_view<T>;
(C++20 起)

[編輯] 註解

對於 single_view,繼承的 empty 成員函式總是返回 false,並且繼承的 operator bool 轉換函式總是返回 true

[編輯] 示例

#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";
}

輸出

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, 😄 }

[編輯] 缺陷報告

下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
LWG 3428 C++20 single_view 可從 std::in_place_t 轉換 建構函式被顯式化
LWG 4035 C++20 single_view 未提供成員函式 empty() 提供 empty()
P2367R0 C++20 single_view 的推導指引未能使實參衰變;
views::single 複製但未包裝 single_view
提供了一個衰變指引;
使其始終包裝

[編輯] 參見

(C++17)
可能包含或不包含物件的包裝器
(類模板) [編輯]
一個不含元素的空 view
(類模板) (變數模板)[編輯]
一個 view,包含透過分隔符拆分另一個 view 獲得的子範圍
(類模板) (range adaptor object)[編輯]