On this page
article
C++ Make Tuple
기본 개념
tuple
을 Variadic Template으로 직접 구현- 각 타입마다 하나씩 상속하면서 값을 저장
tuple<int, double, char>
이면:tuple<int, double, char> → tuple<double, char> → tuple<char> → tuple<>
코드
#include <iostream>
#include <utility> // std::forward
// 기본 템플릿 (빈 tuple)
template<typename ... Ts>
struct tuple {
static constexpr int N = 0;
};
// 재귀적으로 상속
template<typename T, typename ... Ts>
struct tuple<T, Ts...> : public tuple<Ts...> {
using base = tuple<Ts...>; // 부모 클래스
T value; // 현재 타입의 값
tuple() = default;
// 생성자: forwarding 사용
template<typename A, typename ... Types>
tuple(A&& v, Types&& ... args)
: value(std::forward<A>(v)),
base(std::forward<Types>(args)...) {}
static constexpr int N = base::N + 1; // 인자 개수 카운트
};
int main() {
tuple<int, double, char> t1(3, 3.4, 'A');
tuple<int, double, char> t2(3, 3.4); // 잘못된 생성자 호출 → char 인자 없음
}
설명
tuple<T, Ts…>는 자신의 타입 T를 저장하고, 나머지 Ts…에 대해 tuple<Ts…>를 상속
생성자에서 std::forward로 각 인자를 적절한 참조 형태로 전달
static constexpr int N으로 총 인자 개수 카운트