상속 시 멤버 이름 충돌 해결

동일한 이름의 멤버가 기반 클래스와 파생 클래스 모두에 존재할 경우기반 클래스 참조로 캐스팅하면 접근 가능.

  struct Base { double value = 3.4; };
struct Derived : Base { int value = 10; };

int main() {
    Derived d;
    std::println("{}", d.value);                   // 10
    std::println("{}", static_cast<Base&>(d).value);  // 3.4
}
  

get 구현의 핵심 아이디어도 이 상속 구조를 활용!

get 함수의 아이디어

  • std::size_t Ntypename TP를 받아서
  • TP의 N번째 base 타입을 구해
  • static_cast로 캐스팅 → value 접근

즉, get<N>(tuple)은 N번째 base 타입으로 캐스팅 후 .value를 반환하면 된다.

tuple_element 구현

  • tuple_element: N번째 타입과 N번째 base tuple 타입을 계산하는 템플릿
  • tuple_type: base tuple 타입
  #include "tuple.h"
#include <print>

// tuple_element 기본 구조
template<std::size_t N, typename TP>
struct tuple_element;

// N = 0 → 첫번째 타입
template<typename T, typename ... Ts>
struct tuple_element<0, tuple<T, Ts...>> {
    using type = T;
    using tuple_type = tuple<T, Ts...>;
};

// N > 0 → 재귀적으로 N-1번째로 이동
template<std::size_t N, typename T, typename ... Ts>
struct tuple_element<N, tuple<T, Ts...>> {
    using type = typename tuple_element<N-1, tuple<Ts...>>::type;
    using tuple_type = typename tuple_element<N-1, tuple<Ts...>>::tuple_type;
};
  

get 함수 구현

  template<std::size_t N, typename TP>
typename tuple_element<N, TP>::type& get(TP& t) {
    return static_cast<typename tuple_element<N, TP>::tuple_type&>(t).value;
}
  

static_cast로 N번째 base tuple로 캐스팅 후 .value 접근

사용 예시

  int main() {
    tuple<int, double, char> t(3, 3.4, 'A');

    get<0>(t) = 10;
    std::println("{}", get<0>(t));  // 10
    std::println("{}", get<1>(t));  // 3.4
    std::println("{}", get<2>(t));  // A
}