名前空間
変種
操作

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

From cppreference.com
< cpp‎ | ranges
 
 
Rangesライブラリ
Rangeアダプタ
 
ヘッダ <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 /* 未指定 */ single = /* 未指定 */;

}
(2) (C++20以降)
呼び出しシグネチャ
template< class T >

    requires /* 以下を参照 */

constexpr /* 以下参照 */ single( T&& t );
(C++20以降)
1) 指定された値の要素を1つだけ含むviewを生成します。
2)views::single(e) は、任意の適切な部分式 e に対して、single_view<std::decay_t<decltype((e))>>(e)式等価です。

要素の生存期間は、親のsingle_viewに束縛されます。single_viewをコピーすると、要素のコピーが作成されます。

目次

カスタマイゼーションポイントオブジェクト

views::singleという名前は、FunctionObjectであり、LiteralTypeSemiregularなクラス型のカスタマイズポイントオブジェクトを指します。説明のために、その型のcv修飾されていないバージョンは__single_fnと表記されます。

__single_fnのすべてのインスタンスは等価です。同じ引数に対して異なる__single_fn型のインスタンスを呼び出した場合の効果は、インスタンスを表す式がlvalueかrvalueか、cv修飾されているかどうかにかかわらず同等です(ただし、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を構築します。
(public member function)
要素へのポインタを返します。
(public member function)
要素の次の位置へのポインタを返します。
(public member function)
[static]
falseを返します。
(public static member function)
[static]
1を返します。
(public static member function)
要素へのポインタを返します。
(public member function)
std::ranges::view_interface から継承
(C++23)
範囲の先頭への定数イテレータを返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
(C++23)
範囲の定数イテレータの番兵を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
派生ビューが空でないかどうかを返す。ranges::empty が適用可能な場合にのみ提供される
(std::ranges::view_interface<D> の public メンバ関数) [編集]
派生ビューが forward_range を満たす場合に、派生ビューの最初の要素を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
派生ビューが bidirectional_rangecommon_range の両方を満たす場合にのみ、派生ビューの最後の要素を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
派生ビューが random_access_range を満たす場合にのみ、派生ビューの n番目の要素を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]

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) value_tで初期化します。
3) value_std::move(t)で初期化します。
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_viewsplit_viewによって要求される/*tiny-range*/モデルにします。

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++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 3428 C++20 single_viewstd::in_place_tから変換可能でした コンストラクタがexplicitになりました
LWG 4035 C++20 single_viewはメンバ関数empty()を提供しませんでした empty()を提供
P2367R0 C++20 single_viewの推論ガイドは引数をdecayさせませんでした。
views::singlesingle_viewをコピーしましたが、ラップしませんでした。
decaying guideを提供;
常にラップするように変更

[編集] 関連項目

(C++17)
オブジェクトを保持しているかもしれないし、していないかもしれないラッパー
(クラステンプレート) [編集]
要素を持たない空の view
(クラステンプレート) (変数テンプレート)[編集]
別のviewを区切り文字で分割して得られる部分rangeに対する view
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
English 日本語 中文(简体) 中文(繁體)