std::ranges::views::single, std::ranges::single_view
| ヘッダ <ranges> で定義 |
||
| (1) | ||
template< std::copy_constructible T > requires std::is_object_v<T> |
(C++20以降) (C++23まで) |
|
| template< std::move_constructible T > requires std::is_object_v<T> |
(C++23から) | |
| namespace views { inline constexpr /* 未指定 */ single = /* 未指定 */; |
(2) | (C++20以降) |
| 呼び出しシグネチャ |
||
| template< class T > requires /* 以下を参照 */ |
(C++20以降) | |
viewを生成します。要素の生存期間は、親のsingle_viewに束縛されます。single_viewをコピーすると、要素のコピーが作成されます。
目次 |
カスタマイゼーションポイントオブジェクト
views::singleという名前は、FunctionObjectであり、LiteralTypeでSemiregularなクラス型のカスタマイズポイントオブジェクトを指します。説明のために、その型のcv修飾されていないバージョンは__single_fnと表記されます。
__single_fnのすべてのインスタンスは等価です。同じ引数に対して異なる__single_fn型のインスタンスを呼び出した場合の効果は、インスタンスを表す式がlvalueかrvalueか、cv修飾されているかどうかにかかわらず同等です(ただし、volatile修飾されたインスタンスは呼び出し可能である必要はありません)。したがって、views::singleは自由にコピーでき、そのコピーは相互に交換可能です。
型のセットArgs...が与えられた場合、std::declval<Args>()... が上記views::singleの引数要件を満たす場合、__single_fnは以下をモデル化します。
- std::invocable<__single_fn, Args...>,
- std::invocable<const __single_fn, Args...>,
- std::invocable<__single_fn&, Args...>, および
- std::invocable<const __single_fn&, Args...>.
それ以外の場合、__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_range と common_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...> |
(4) | (C++20以降) |
single_viewを構築します。
value_をデフォルト初期化します。これは、その保持する値を値初期化します。value_をtで初期化します。value_をstd::move(t)で初期化します。
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をsplit_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_viewはstd::in_place_tから変換可能でした |
コンストラクタがexplicitになりました |
| LWG 4035 | C++20 | single_viewはメンバ関数empty()を提供しませんでした |
empty()を提供 |
| P2367R0 | C++20 | single_viewの推論ガイドは引数をdecayさせませんでした。views::singleはsingle_viewをコピーしましたが、ラップしませんでした。 |
decaying guideを提供; 常にラップするように変更 |
[編集] 関連項目
| (C++17) |
オブジェクトを保持しているかもしれないし、していないかもしれないラッパー (クラステンプレート) |
要素を持たない空の view(クラステンプレート) (変数テンプレート) | |
別のviewを区切り文字で分割して得られる部分rangeに対する view(クラステンプレート) (rangeアダプタオブジェクト) |