1 분 소요

  • (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_tinteger_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를 이용하면, 추출할 인덱스만 지정하여 arraytuple로 변환하는 코드를 좀더 깔끔하게 만들 수 있습니다.

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 
); 

태그:

카테고리:

업데이트:

댓글남기기