- ranges[meta header]
- std::ranges[meta namespace]
- class template[meta id-type]
- cpp20[meta cpp]
namespace std::ranges {
template<copy_constructible T>
requires is_object_v<T>
class single_view : public view_interface<single_view<T>> { …… }; // (1) C++20
template<move_constructible T>
requires is_object_v<T>
class single_view : public view_interface<single_view<T>> { …… }; // (1) C++23
namespace views {
inline constexpr /*unspecified*/ single = /*unspecified*/; // (2)
}
}
- (1): 値を要素1つのRangeに見せる
view
- (2):
single_viewを生成するカスタマイゼーションポイントオブジェクト
| borrowed |
sized |
output |
input |
forward |
bidirectional |
random_access |
contiguous |
common |
viewable |
view |
|
○ |
○ |
○ |
○ |
○ |
○ |
○ |
○ |
○ |
○ |
- (1) :
- C++20 : 型
Tがコピー構築可能であること
- C++23 : 型
Tがムーブ構築可能であること
- 式
views::single(E)の効果はsingle_view<decay_t<decltype((E))>>(E)と等しい。
| 名前 |
説明 |
対応バージョン |
size |
要素数を取得する |
C++20 |
empty |
Rangeが空かどうかを判定する |
C++20 |
| 名前 | 説明 | 対応バージョン |
|----------------------------------------------|------------------------------ ----|----------------|
| operator bool | Rangeが空でないかどうかを判定する | C++20 |
| front | 先頭要素への参照を取得する | C++20 |
| back | 末尾要素への参照を取得する | C++20 |
| operator[] | 要素へアクセスする | C++20 |
| cbegin | 定数イテレータを取得する | C++23 |
| cend | 定数イテレータ(番兵)を取得する | C++23 |
#include <ranges>
#include <iostream>
int main() {
using namespace std;
for(int n : views::single(1)) {
cout << n;
}
}
- views::single[color ff0000]
namespace std::ranges {
template<copy_constructible T>
requires is_object_v<T>
class single_view : public view_interface<single_view<T>> {
private:
copyable-box<T> value_;
public:
single_view() requires default_initializable<T> = default;
constexpr explicit single_view(const T& t): value_(t) {
}
constexpr explicit single_view(T&& t): value_(t) {
}
template<class... Args>
requires constructible_from<T, Args...>
constexpr explicit single_view(in_place_t, Args&&... args): value_{in_place, forward<Args>(args)...} {
}
constexpr T* begin() noexcept {
return data();
}
constexpr const T* begin() const noexcept {
return data();
}
constexpr T* end() noexcept {
return data() + 1;
}
constexpr const T* end() const noexcept {
return data() + 1;
}
static constexpr size_t size() noexcept {
return 1;
}
constexpr T* data() noexcept {
return value_.operator->();
}
constexpr const T* data() const noexcept {
return value_.operator->();
}
};
template<class T>
single_view(T) -> single_view<T>;
}
- constructible_from[link /reference/concepts/constructible_from.md]
- copyable-box[link copyable_box.md]
- Clang: 13.0.0 [mark verified]
- GCC: 10.1.0 [mark verified]
- ICC: ?
- Visual C++: 2019 Update 10 [mark verified]