types_is_swappable
types_is_swappable (스와퍼블 타입 판별)
이 페이지에서는 C++17부터 제공되는 <type_traits> 헤더의 is_swappable 계열 타입 특성(trait)을 다뤄요. 이 특성들은 주어진 타입들이 swap 표현식으로 교환 가능한지, 그리고 그 과정에서 예외가 발생하지 않는지를 컴파일 타임에 판별해 줍니다. 특히 std::swap과 같은 일반화된 교환 동작을 조건부로 활성화할 때 유용하게 사용할 수 있어요.
출처: cppreference
본문
정의
<type_traits> 헤더에 다음과 같은 네 가지 클래스 템플릿이 정의되어 있어요.
template < class T , class U > struct is_swappable_with ; // (1) since C++17
template < class T > struct is_swappable ; // (2) since C++17
template < class T , class U > struct is_nothrow_swappable_with ; // (3) since C++17
template < class T > struct is_nothrow_swappable ; // (4) since C++17
- (1)은
T와U타입의 객체가 서로 교환 가능한지 검사해요. - (2)는
T타입의 객체가 자기 자신과 교환 가능한지, 즉std::is_swappable_with<T, T>와 동일한 의미를 가져요. - (3)은
T와U의 교환이 예외를 던지지 않는지 검사해요. - (4)는
T타입의 자기 교환이 예외를 던지지 않는지 검사해요.
만약 T 또는 U가 완전한 타입(complete type)이 아니거나, cv 한정된 void, 또는 경계를 알 수 없는 배열이라면 동작이 정의되지 않아요. 또한 이 템플릿의 인스턴스화가 불완전한 타입에 직간접적으로 의존하고, 그 타입이 가상으로 완성되었을 때 결과가 달라질 수 있다면 동작이 정의되지 않아요. 이 페이지에 설명된 템플릿에 대해 프로그램이 특수화를 추가하는 경우에도 동작이 정의되지 않아요.
헬퍼 변수 템플릿
각 클래스 템플릿에 대응하는 _v 접미사 변수 템플릿도 제공돼요.
template < class T , class U > constexpr bool is_swappable_with_v = is_swappable_with < T , U >:: value ; // since C++17
template < class T > constexpr bool is_swappable_v = is_swappable < T >:: value ; // since C++17
template < class T , class U > constexpr bool is_nothrow_swappable_with_v = is_nothrow_swappable_with < T , U >:: value ; // since C++17
template < class T > constexpr bool is_nothrow_swappable_v = is_nothrow_swappable < T >:: value ; // since C++17
std::integral_constant에서 상속
이 특성들은 std::integral_constant<bool, value>를 상속받아요. 따라서 다음과 같은 멤버들을 사용할 수 있어요.
멤버 상수
| 이름 | 설명 |
|---|---|
value |
T가 U와 교환 가능하면 true, 아니면 false (정적 멤버 상수) |
멤버 함수
| 이름 | 설명 |
|---|---|
operator bool |
객체를 bool로 변환하며 value를 반환해요 |
operator() (C++14) |
value를 반환해요 |
멤버 타입
| 타입 | 정의 |
|---|---|
value_type |
bool |
type |
std::integral_constant<bool, value> |
참고 사항
이 특성은 swap 표현식의 직접적인 문맥(immediate context) 밖의 요소는 검사하지 않아요. 예를 들어 T나 U의 사용이 템플릿 특수화나 암시적으로 정의된 특수 멤버 함수의 생성을 유발하고, 그 과정에서 오류가 발생한다면 실제 swap은 컴파일되지 않을 수 있어요. 이 경우 std::is_swappable_with<T, U>::value가 컴파일되고 true로 평가되더라도 실제 교환 코드는 실패할 수 있다는 점을 주의해야 해요.
예제
이 섹션은 아직 작성되지 않았어요. (Reason: no example)
같이 보기
| 항목 | 설명 |
|---|---|
swap |
두 객체의 값을 교환하는 함수 템플릿 [edit] |
iter_swap |
두 반복자가 가리키는 요소를 교환하는 함수 템플릿 [edit] |
ranges::iter_swap (C++20) |
역참조 가능한 두 객체가 참조하는 값을 교환하는 커스터마이제이션 포인트 객체 [edit] |
is_move_assignable, is_trivially_move_assignable, is_nothrow_move_assignable (C++11) |
타입에 이동 대입 연산자가 있는지 검사하는 클래스 템플릿 [edit] |
swappable, swappable_with (C++20) |
한 타입이 교환 가능하거나 두 타입이 서로 교환 가능함을 지정하는 개념(concept) [edit] |
indirectly_swappable (C++20) |
두 indirectly_readable 타입이 참조하는 값들을 교환할 수 있음을 지정하는 개념 [edit] |
is_swappable_with_type, is_swappable_type, is_nothrow_swappable_with_type, is_nothrow_swappable_type (C++26) |
반영된 한 타입의 객체가 다른 반영된 타입의 객체와 교환될 수 있는지 검사하는 함수 [edit] |