#34. [모던 C++ STL] any(C++17)
- (C++17~) any가 추가되어 타입의 변동 가능성이 있는 데이터를 비교적 안전하게 사용할 수 있습니다.
개요
기존에는 타입의 변동 가능성이 있는 데이터는 void*
로 저장한뒤 이를 사용할때 실제 사용할 타입으로 변환하기 위해 reinterpret_cast를 사용했었습니다.
1
2
3
4
5
6
7
void* data{new int}; // int 타입을 사용합니다.
*reinterpret_cast<int*>(data) = 10;
delete reinterpret_cast<int*>(data);
class T {};
data = new T; // T 타입을 사용합니다.
delete reinterpret_cast<T*>(data);
타입 안전 측면에서는 권장하지 않는데요,
C++17 부터는 any가 추가되어 타입의 변동 가능성이 있는 데이터를 비교적 안전하게 사용할 수 있습니다.
항목 | 내용 |
---|---|
= (C++17~) |
복사 대입 또는 이동 대입합니다. |
emplace() (C++17~) |
내부 개체를 생성해서 전달하는 것이 아니라, 내부 개체의 생성자 인수들을 전달하면 any 내에서 내부 개체를 직접 생성합니다. |
reset() (C++17~) |
내부 개체를 초기화합니다. |
swap() (C++17~) |
바꿔치기 합니다. |
has_value() (C++17~) |
내부 개체가 있는지 검사합니다. |
type() (C++17~) |
(작성중) |
any_cast() (C++17~) |
내부 개체 타입으로 변경하여 내부 개체를 접근합니다. 타입이 다르면, bad_any_cast 예외가 발생합니다. |
make_any() (C++17~) |
(작성중) |
bad_any_cast (C++17~) |
any 사용시 타입이 일치하지 않을때 bad_any_cast 예외가 발생합니다. |
다음 예에서는 any 개체로 정수 타입과 T
타입을 번갈아 가며 사용합니다. reinterpret_cast 대신 any_cast()
를 사용하며, delete를 하지 않아도 됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
std::any data{10}; // 정수 타입을 사용합니다.
EXPECT_TRUE(std::any_cast<int>(data) == 10); // 데이터를 사용할때 any_cast를 이용합니다.
class T {
public:
int m_Val{1};
};
data = T{}; // T 타입을 사용합니다.
EXPECT_TRUE(std::any_cast<T>(data).m_Val == 1);
data.reset(); // 데이터를 초기화합니다.
EXPECT_TRUE(data.has_value() == false);
댓글남기기