std::ranges::views::repeat, std::ranges::repeat_view
| ヘッダ <ranges> で定義 |
||
| template< std::move_constructible W, std::semiregular Bound = std::unreachable_sentinel_t > |
(1) | (C++23から) |
| namespace views { inline constexpr /* unspecified */ repeat = /* unspecified */; |
(2) | (C++23から) |
| 呼び出しシグネチャ |
||
| template< class W > requires /* 以下を参照 */ |
(C++23から) | |
| template< class W, class Bound > requires /* 以下を参照 */ |
(C++23から) | |
| ヘルパーコンセプト |
||
concept /*integer-like-with-usable-difference-type*/ = /*is-signed-integer-like*/<T> || |
(3) | (説明用*) |
repeat_view は random_access_range をモデル化します。もし Bound が std::unreachable_sentinel_t でない場合、repeat_view は sized_range および common_range もモデル化します。
目次 |
カスタマイゼーションポイントオブジェクト
views::repeat という名前は、const リテラル semiregular クラス型の関数オブジェクトであるカスタマイゼーションポイントオブジェクトを指します。説明のために、その型のcv非限定バージョンは__repeat_fnと表記されます。
__repeat_fn のすべてのインスタンスは等価です。異なる型の __repeat_fn のインスタンスを同じ引数で呼び出した場合の効果は、そのインスタンスを表す式がl値かr値か、const修飾されているかどうかにかかわらず等価です(ただし、volatile修飾されたインスタンスは呼び出し可能である必要はありません)。したがって、views::repeat は自由にコピーでき、そのコピーは互換的に使用できます。
型のセット Args... が与えられたとき、std::declval<Args>()... が上記の views::repeat の引数の要件を満たしている場合、__repeat_fn は以下をモデル化します。
- std::invocable<__repeat_fn, Args...>,
- std::invocable<const __repeat_fn, Args...>,
- std::invocable<__repeat_fn&, Args...>, および
- std::invocable<const __repeat_fn&, Args...>.
そうでなければ、__repeat_fn の関数呼び出し演算子はオーバーロード解決に参加しません。
[編集] データメンバー
| メンバ | 定義 |
movable-box <W> value_ |
ビューの繰り返し要素 (説明用のメンバオブジェクト*) |
Bound bound_ |
番兵値 (説明用のメンバオブジェクト*) |
[編集] メンバ関数
repeat_view を作成します。(public member function) | |
repeat_view の開始イテレータを取得します。(public member function) | |
repeat_view の末尾を示す番兵を取得します。(public member function) | |
repeat_view がサイズを持つ場合、そのサイズを取得します。(public member function) | |
std::ranges::view_interface から継承 | |
派生ビューが空かどうかを返す。sized_range または forward_range を満たす場合にのみ提供される( std::ranges::view_interface<D> の public メンバ関数) | |
| (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::repeat_view::repeat_view
| repeat_view() requires std::default_initializable<W> = default; |
(1) | (C++23から) |
| constexpr explicit repeat_view( const W& value, Bound bound = Bound() ); |
(2) | (C++23から) |
| constexpr explicit repeat_view( W&& value, Bound bound = Bound() ); |
(3) | (C++23から) |
| template < class... WArgs, class... BoundArgs > requires std::constructible_from<W, WArgs...> |
(4) | (C++23から) |
value_ を std::make_from_tuple<T>(std::move(value_args)) で、bound_ を std::make_from_tuple<Bound>(std::move(bound_args)) で初期化します。パラメータ
| value | - | 繰り返し生成される値 |
| bound | - | 境界 |
| value_args | - | value_ の初期化子を含むタプル |
| bound_args | - | bound_ の初期化子を含むタプル |
std::ranges::repeat_view::begin
| constexpr /*iterator*/ begin() const; |
(C++23から) | |
iterator (std::addressof(*value_ )) を返します。
std::ranges::repeat_view::end
| constexpr /*iterator*/ end() const requires (!std::same_as<Bound, std::unreachable_sentinel_t>); |
(1) | (C++23から) |
| constexpr std::unreachable_sentinel_t end() const; |
(2) | (C++23から) |
iterator (std::addressof(*value_ ), bound_ ) を返します。
std::ranges::repeat_view::size
| constexpr auto size() const requires (!std::same_as<Bound, std::unreachable_sentinel_t>); |
(C++23から) | |
to-unsigned-like (bound_ ) を返します。
[編集] 推論ガイド
| template< class W, class Bound = std::unreachable_sentinel_t > repeat_view( W, Bound = Bound() ) -> repeat_view<W, Bound>; |
(C++23から) | |
[編集] 入れ子クラス
| イテレータ型 (説明専用メンバクラス*) |
[編集] 注釈
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_lib_ranges_repeat |
202207L |
(C++23) | std::ranges::repeat_view
|
[編集] 例
#include <iostream> #include <ranges> #include <string_view> using namespace std::literals; int main() { // bounded overload for (auto s : std::views::repeat("C++"sv, 3)) std::cout << s << ' '; std::cout << '\n'; // unbounded overload for (auto s : std::views::repeat("I know that you know that"sv) | std::views::take(3)) std::cout << s << ' '; std::cout << "...\n"; }
出力
C++ C++ C++ I know that you know that I know that you know that I know that you know that ...
[編集] 欠陥報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 4053 | C++20 | views::repeat への単項呼び出しは引数を減衰させなかった。 |
引数を減衰させる |
| LWG 4054 | C++20 | repeat_view を使って views::repeat を呼び出すネストされた repeat_view を作成しなかった。 |
ネストされたものを作成するrepeat_view
|
[編集] 関連項目
| (C++20) |
初期値を繰り返しインクリメントして生成されるシーケンスからなる view(クラステンプレート) (カスタマイゼーションポイントオブジェクト) |