기본 개념

  • tupleVariadic 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으로 총 인자 개수 카운트