std::tuple을 알아보자.

1. std::tuple

1.1. tuple이란

tuple은 pair를 확장한 C++ 라이브러리 클래스다. (이걸 뭐라고 부르지..?) pair는 두 개의 값을 저장할 수 있지만, tuple은 제한이 없다. 그리고 멤버에 접근할 수 있는 멤버함수가 없다. 접근할려면 std::get이라는 함수를 사용해야한다.

...음, 사실 몇일전에 tuple같은 것을 만들려고 애를 쓴 적이 있었다. 그떈, tuple이 있는지도 몰랐기 떄문에 직접 만들었었다. 어떻게 템플릿 떡칠을 해서 만들긴 했는데...가독성도 좋지않고, 단순히 같은 코드를 많이 늘어놓았을 뿐인 좋지않은 코드가 되어버렸다.

1.2. 예시

int main()
{
    std::tuple<int, float> tu = std::make_tupe(10, 10.2f);

    std::cout << std::get<0>(tu) << std::endl;

    return 0;
}

1.3. std::make_tuple

tuple변수에 값을 넣을 때는 make_tupe()함수를 사용해야한다. 이 함수는 단순히 인자의 타입과 개수에 맞는 tuple을 반환하긴하지만, tuple의 생성 원리를 보기엔 굉장히 좋은 함수다.

조금 내가 이해하기 쉽게 코드를 정리하자면..아마 다음과 같은 코드일 것이다. 아니면 말고..ㅎ;

template <class... types> class tuple;

template <> class tuple<> {};

template <class T, class... types> 
class tuple<T, types...> : private tuple<types...>{
public:
    tuple() {}
    tuple(const T& t, types... args) :m_t(t), tuple<types...>(args...) {}

private:        
    T m_t;
};

사족으로는, MS는 왜이렇게 빈 구조체를 좋아하는건지 모르겠다. 이전의 std::function에도 멤버변수가 없는 구조체가 자주 보이던데, make_tuple에도 있더라. 사용하는 이유가 있는 것같은데, 내 머리로는 잘 모르겠더라...

1.4. std::get

위에서 tuple은 멤버에 접근할 수 있는 멤버함수가 없다고 했다. 접근할 수 있는 방법은 std::get이라는 함수이다. 위의 내 예제에서도 private으로 되어있기에 접근할 수 없다. public으로 걸어도 첫 번째의 변수에만 접근할 수 있다.

std::get은 위의 예시와 같이 사용하면 된다. 특이하게 템플릿의 타입으로 인자의 위치를 받아낸다. 이것은 템플릿이 size_t로 되어있고, 재귀함수처럼 size_t를 조건문으로 사용하기 때문이다.

다시 흉내를 내자면 아래 코드와 같지 않을까싶은데..

template<size_t N, class T_tuple>
class tuple_element;

template<size_t N, class T, class... Types>
class tuple_element<N, tuple<T, Types...>>
    :public tuple_element<N-1, tuple<Types...>>
{

};

template <size_t N, typename ... Types>
inline typename tuple_element<N, tuple<Types...>>::Type& Get(tuple<Types...>& t)
{
    using tuple_Type = typename tuple_element<N, tuple<Types...>>::TupleType;
    return ((tuple_Type&)t).m_t;
}

템플릿 가변인자

'프로그래밍 > 프로그래밍 관련' 카테고리의 다른 글

AES 암호화  (0) 2019.01.13
UML을 살펴보자  (0) 2019.01.13
Lambda (람다)  (0) 2018.04.25
함수 포인터로 함수명 변경하기 (완결)  (0) 2018.04.24
Epoll  (0) 2018.03.22
더보기

댓글,

Lowpoly

게임 서버 프로그래머 지망생