On this page
article
C++ Make Tuple Get
상속 시 멤버 이름 충돌 해결
동일한 이름의 멤버가 기반 클래스와 파생 클래스 모두에 존재할 경우 → 기반 클래스 참조로 캐스팅하면 접근 가능.
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 N
과typename 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
}