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
/* unspecified */
single
=
/* unspecified */
;
|
(2) | (C++20부터) |
|
호출 시그니처
|
||
|
template
<
class
T
>
requires
/* see below */
|
(C++20부터) | |
view
를 생성합니다.
요소의 수명은 부모
single_view
에 바인딩됩니다.
single_view
를 복사하면 요소의 복사본이 생성됩니다.
목차 |
커스터마이제이션 포인트 객체
views::single
이름은
커스터마이제이션 포인트 객체
를 나타내며, 이는
함수 객체
의 상수이며
리터럴
semiregular
클래스 타입입니다. 자세한 내용은
CustomizationPointObject
를 참조하십시오.
데이터 멤버
| 멤버 | 정의 |
copyable-box
<T>
value_
(C++23 이전)
|
뷰의 단일 요소
( 설명 전용 멤버 객체* ) |
movable-box
<T>
value_
(C++23 이후)
|
뷰의 단일 요소
( 설명 전용 멤버 객체* ) |
멤버 함수
single_view
를 생성합니다
(public 멤버 함수) |
|
|
요소에 대한 포인터를 반환합니다
(public 멤버 함수) |
|
|
요소의 끝을 가리키는 포인터를 반환합니다
(public 멤버 함수) |
|
|
[static]
|
false
를 반환합니다
(public static 멤버 함수) |
|
[static]
|
1
을 반환합니다
(public static 멤버 함수) |
|
요소에 대한 포인터를 반환합니다
(public 멤버 함수) |
|
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 멤버 함수)
|
|
파생 뷰의
n
번째
요소를 반환합니다.
random_access_range
를 만족하는 경우에만 제공됩니다
(
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}; // (const T&) 생성자 사용 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)}; // (T&&) 생성자 사용 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, "😄"}; // (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
에 대한 deduction guide가 인수의 decay에 실패함;
views::single
가
single_view
를 복사만 하고 wrapping하지 않았음
|
decaying guide 제공;
항상 wrapping하도록 변경됨 |
참고 항목
|
(C++17)
|
객체를 보유할 수도 있고 보유하지 않을 수도 있는 래퍼
(클래스 템플릿) |
|
(C++20)
|
요소가 없는 빈
view
(클래스 템플릿) (변수 템플릿) |
|
(C++20)
|
구분자를 사용하여 다른
view
를 분할하여 얻은 하위 범위에 대한
view
(클래스 템플릿) (범위 어댑터 객체) |