#40. [모던 C++ STL] concepts(C++20)
- (C++20~) same_as, derived_from, convertible_to, integral, floating_point, assignable_from, swappable, destructible, constructible_from, default_initializable, move_constructible, copy_constructible등이 추가되었습니다.
- (C++20~) equality_comparable, three_way_comparable등이 추가되었습니다.
- (C++20~) movable, copyable, semiregular, regular등이 추가되었습니다.
- (C++20~) invocable, predicate등이 추가되었습니다.
- (C++20~) forward_iterator, predicate, bidirectional_iterator, random_access_iterator등이 추가되었습니다.
- (C++20~) ranges::forward_range, ranges::bidirectional_range, ranges::random_access_range등이 추가되었습니다.
- (C++20~) 유틸리티 컨셉이 추가되었습니다.
개요
컨셉은 템플릿 인자나 auto에 제약 조건(constraint)을 주어 특정 타입만 사용하게 할 수 있습니다.
1
2
3
4
5
template<typename T>
requires std::integral<T> || std::floating_point<T> // T 정수 타입이나 실수 타입이어야 하합니다.
T Add_20(T a, T b) {
return a + b;
}
자세한 사용법은 컨셉을 참고하기 바라며, STL에서는 기본으로 사용할 수 있는 다양한 컨셉들을 제공합니다.
핵심 언어 컨셉
| 항목 | 내용 |
|---|---|
same_as<T, U> (C++20~) |
T, U 타입이 같습니다. |
derived_from<Base, Derived> (C++20~) |
Base는 Derived의 부모 개체이며, Derived는 Base로 변환될 수 있습니다. |
convertible_to<From, To> (C++20~) |
From은 To로 변환될 수 있습니다. |
common_reference_with (C++20~) |
(작성중) |
common_with (C++20~) |
(작성중) |
integral<T> (C++20~) |
T는 정수 타입(bool, char, signed char, unsigned char, wchar_8, char8_t, char16_t, char32_t, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long)입니다. |
signed_integral<T> (C++20~) |
integral<T> 이고 부호가 있습니다. |
unsigned_integral<T> (C++20~) |
integral<T> 이고 부호가 없습니다. |
floating_point<T> (C++20~) |
T는 실수 타입(float, double, long double)입니다. |
assignable_from<Left, Right> (C++20~) |
Left 타입에 Right 타입을 복사 대입이나 이동 대입할 수 있습니다. |
swappable<T>, swappable_with<T, U> (C++20~) |
T를 바꿔치기 할 수 있습니다.T와 U를 바꿔치기 할 수 있습니다. |
destructible<T> (C++20~) |
T를 예외 발생 없이 소멸할 수 있습니다. |
constructible_from<T, ... Args> (C++20~) |
T를 예외 발생 없이 소멸할 수 있고, Args로 생성할 수 있습니다. |
default_initializable<T> (C++20~) |
T를 예외 발생 없이 소멸할 수 있고, T{}로 생성할 수 있습니다. |
move_constructible<T> (C++20~) |
T를 예외 발생 없이 소멸할 수 있고, T를 이동 생성할 수 있습니다. |
copy_constructible<T> (C++20~) |
T를 예외 발생 없이 소멸할 수 있고, T를 이동 생성할 수 있고, T를 복사 생성할 수 있습니다. |
비교 컨셉
| 항목 | 내용 |
|---|---|
boolean-testable (C++20~) |
(작성중) |
equality_comparable<T>, equality_comparable_with<T, U> (C++20~) |
T 혹은 T와 U간에 ==, != 를 할 수 있습니다. |
totally_ordered<T>, totally_ordered_with<T, U> (C++20~) |
T 혹은 T와 U간에 ==, !=, <, >, <=, >=를 할 수 있습니다. |
three_way_comparable<T>, three_way_comparable_with<T, U>(C++20~) |
T 혹은 T와 U간에 <=>를 할 수 있습니다. |
개체 컨셉
| 항목 | 내용 |
|---|---|
movable<T> (C++20~) |
swappable<T>이고, T를 예외 발생 없이 소멸할 수 있고, T를 이동 연산할 수 있습니다. |
copyable<T> (C++20~) |
movable<T>이고, 복사 연산이 가능합니다. |
semiregular<T> (C++20~) |
copyable<T>이고, default_initializable<T>입니다. 즉, 기본 생성자, 복사 생성자, 이동 생성자, 복사 대입 연산자, 이동 대입 연산자, 예외 발생 없는 소멸자이고, swappable<T>입니다. |
regular<T> (C++20~) |
semiregular<T>이고, ==, != 를 할 수 있습니다. |
함수자 컨셉
| 항목 | 내용 |
|---|---|
invocable<F, ... Args>, regular_invocable<F, ... Args> (C++20~) |
F(Args)로 호출할 수 있습니다. |
predicate<F, ... Args> (C++20~) |
regular_invocable<F, ... Args>이고, bool을 리턴합니다. |
relation (C++20~) |
(작성중) |
equivalence_relation (C++20~) |
(작성중) |
strict_weak_order (C++20~) |
(작성중) |
이터레이터 컨셉
| 항목 | 내용 |
|---|---|
| indirectly_readable (C++20~) | *을 이용하여 간접적으로 읽을 수 있습니다. |
indirectly_writable (C++20~) |
(작성중) |
weakly_incrementable (C++20~) |
(작성중) |
incrementable (C++20~) |
(작성중) |
| input_or_output_iterator (C++20~) | ++, *을 할 수 있습니다. |
sentinel_for (C++20~) |
(작성중) |
| sized_sentinel_for (C++20~) | 이터레이터의 시작(begin())과 끝(end())의 차로 요소의 갯수를 구할 수 있습니다. |
| input_iterator (C++20~) | input_or_output_iterator이고, indirectly_readable입니다. |
output_iterator (C++20~) |
(작성중) |
| forward_iterator (C++20~) | ++, ++, *, ==, !=을 할 수 있습니다. |
| bidirectional_iterator (C++20~) | forward_iterator이고, --을 할 수 있습니다. |
| [random_access_iterator] (C++20~) | bidirectional_iterator이고, +=, +, -=, -, [], <, <=, >, >=을 할 수 있습니다. |
contiguous_iterator (C++20~) |
(작성중) |
유틸리티 컨셉
| 항목 | 내용 |
|---|---|
indirectly_unary_invocable (C++20~)indirectly_regular_unary_invocable (C++20~) |
(작성중) |
indirect_unary_predicate (C++20~) |
(작성중) |
indirect_binary_predicate (C++20~) |
(작성중) |
indirect_equivalence_relation (C++20~) |
(작성중) |
indirect_strict_weak_order (C++20~) |
(작성중) |
indirectly_movable (C++20~) |
(작성중) |
indirectly_movable_storable (C++20~) |
(작성중) |
indirectly_copyable (C++20~) |
(작성중) |
indirectly_copyable_storable (C++20~) |
(작성중) |
indirectly_swappable (C++20~) |
(작성중) |
indirectly_comparable (C++20~) |
(작성중) |
permutable (C++20~) |
(작성중) |
mergeable (C++20~) |
(작성중) |
sortable (C++20~) |
(작성중) |
indirect_result_t (C++20~) |
(작성중) |
projected (C++20~) |
(작성중) |
범위(Range) 컨셉
| 항목 | 내용 |
|---|---|
| ranges::range (C++20~) | 범위(Range)입니다. ranges::begin과 ranges::end가 가능해야 합니다. |
ranges::borrowed_range (C++20~) |
(작성중) |
| ranges::sized_range (C++20~) | 상수 시간에 크기를 알 수 있는 범위(Range)입니다. |
| ranges::view (C++20~) | 범위(Range) 요소들을 재배치/필터링한 일종의 범위(Range)입니다. |
| ranges::input_range (C++20~) | ranges::range이고 input_iterator를 제공합니다. |
ranges::output_range (C++20~) |
(작성중) |
| ranges::forward_range (C++20~) | ranges::input_range이고 forward_iterator를 제공합니다. |
| ranges::bidirectional_range (C++20~) | ranges::forward_range이고, bidirectional_iterator를 제공합니다. |
| ranges::random_access_range (C++20~) | 랜덤 접근을 지원하는 범위(Range)입니다. |
ranges::contiguous_range (C++20~) |
(작성중) |
| ranges::common_range (C++20~) | ranges::range이고, ranges::begin과 ranges::end가 같은 타입이어야 합니다. |
ranges::viewable_range (C++20~) |
(작성중) |
ranges::constant_range (C++20~) |
(작성중) |
포맷팅 컨셉
| 항목 | 내용 |
|---|---|
formattable (C++23~) |
(작성중) |
댓글남기기