#31. [모던 C++ STL] exchange(C++14)
- (C++14~) exchange()가 추가되어 주어진 값을 바꾸는 작업이 간편해 졌습니다. 특히 이동 생성자와 이동 대입 연산자 구현에 활용할 수 있습니다.
개요
exchange()는 주어진 값을 바꾸고 이전값을 리턴합니다.
기존에 이동 생성자와 이동 대입 연산자는 다음과 같이 구현됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Big {
size_t m_Size;
char* m_Ptr; // 크기가 큰 데이터
Big(Big&& other) noexcept :
m_Size(other.m_Size),
m_Ptr(other.m_Ptr) {
other.m_Size = 0; // other는 0, nullptr로 초기화 됩니다.
other.m_Ptr = nullptr;
}
// 이동 대입 연산자. 우측값(rvalue) 이동
Big& operator =(Big&& other) noexcept {
delete[] m_Ptr; // 기존 것은 삭제하고,
m_Size = other.m_Size; // other 것을 저장한뒤
m_Ptr = other.m_Ptr;
other.m_Size = 0; // other는 초기화 합니다.
other.m_Ptr = nullptr;
return *this;
}
};
exchange()를 사용하면 다음과 같이 좀 더 간소하게 작성할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Big_14 {
size_t m_Size;
char* m_Ptr; // 크기가 큰 데이터
Big_14(Big_14&& other) noexcept :
m_Size{std::exchange(other.m_Size, 0)}, // other는 0, nullptr로 초기화 됩니다.
m_Ptr{std::exchange(other.m_Ptr, nullptr)} {}
// 이동 대입 연산자. 우측값(rvalue) 이동
Big_14& operator =(Big_14&& other) noexcept {
delete[] m_Ptr; // 기존 것은 삭제하고,
m_Size = std::exchange(other.m_Size, 0); // other는 0, nullptr로 초기화 됩니다.
m_Ptr = std::exchange(other.m_Ptr, nullptr);
return *this;
}
};
댓글남기기