tuple은 pair를 확장한 C++ 라이브러리 클래스다. (이걸 뭐라고 부르지..?) pair는 두 개의 값을 저장할 수 있지만, tuple은 제한이 없다. 그리고 멤버에 접근할 수 있는 멤버함수가 없다. 접근할려면 std::get이라는 함수를 사용해야한다.
...음, 사실 몇일전에 tuple같은 것을 만들려고 애를 쓴 적이 있었다. 그떈, tuple이 있는지도 몰랐기 떄문에 직접 만들었었다. 어떻게 템플릿 떡칠을 해서 만들긴 했는데...가독성도 좋지않고, 단순히 같은 코드를 많이 늘어놓았을 뿐인 좋지않은 코드가 되어버렸다.
int main()
{
std::tuple<int, float> tu = std::make_tupe(10, 10.2f);
std::cout << std::get<0>(tu) << std::endl;
return 0;
}
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에도 있더라. 사용하는 이유가 있는 것같은데, 내 머리로는 잘 모르겠더라...
위에서 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
게임 서버 프로그래머 지망생