#30. [모던 C++ STL] integer_sequence(C++14)
- (C++14~) integer_sequence가 추가되어 컴파일 타임에 정수 타입의 시퀀스를 만들 수 있습니다.
개요
integer_sequence가 추가되어 컴파일 타임에 정수 타입의 시퀀스를 만들 수 있습니다. 함수 템플릿의 인자로 사용하여 파라메터 팩 배포 및 확장에 사용할 수 있습니다.
항목 | 내용 |
---|---|
integer_sequence<type, 0, 1, 2> (C++14~) |
type 타입으로 0 , 1 , 2 시퀀스를 만듭니다. |
index_sequence<0, 1, 2> (C++14~) |
타입이 size_t 인 integer_sequence 입니다. |
make_integer_sequence<type, N> (C++14~) |
type 타입으로 0 ~ N-1 시퀀스를 만듭니다. |
make_index_sequence<N> (C++14~) |
size_t 타입으로 0 ~ N-1 시퀀스를 만듭니다. |
index_sequence_for<params...> (C++14~) |
0 ~ 파라메터 팩의 요소 갯수만큼 시퀀스를 만듭니다.즉, make_index_sequence(sizeof...(params)) 입니다. |
array 에서 tuple 변환
다음은 array의 일부 요소를 추출하여 tuple을 생성하는 예입니다. 나쁘진 않습니다만, 추출할 요소가 많고 복잡하면 코드가 어지러워 질 수 있습니다.
1
2
3
4
5
6
std::array<int, 5> arr{10, 20, 30, 40, 50};
std::tuple<int, int> data{std::make_tuple(arr[0], arr[1])};
EXPECT_TRUE(
std::get<0>(data) == 10 &&
std::get<1>(data) == 20
);
integer_sequence를 이용하면, 추출할 인덱스만 지정하여 array를 tuple로 변환하는 코드를 좀더 깔끔하게 만들 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template<size_t N, std::size_t... params>
auto ArrayToTuple_14(const std::array<int, N>& arr, std::integer_sequence<size_t, params...>) {
return std::make_tuple(arr[params]...); // arr[params[1]], arr[params[2]], arr[params[3]] 등으로 전개됨
}
std::array<int, 5> arr{10, 20, 30, 40, 50};
// arr 에서 0, 1 인덱스만 tuple로 변환
std::tuple<int, int> data1{ArrayToTuple_14(arr, std::integer_sequence<size_t, 0, 1>{})};
EXPECT_TRUE(
std::get<0>(data1) == 10 &&
std::get<1>(data1) == 20
);
// arr 에서 2, 3, 4 인덱스만 tuple로 변환
std::tuple<int, int, int> data2{ArrayToTuple_14(arr, std::integer_sequence<size_t, 2, 3, 4>{})};
EXPECT_TRUE(
std::get<0>(data2) == 30 &&
std::get<1>(data2) == 40 &&
std::get<2>(data2) == 50
);
댓글남기기