#include <iostream>
template<typename T, typename ...Types>
class xtuple : public xtuple<Types...> {
public:
T value;
xtuple() {}
xtuple(const T& a, Types ...args) :value(a), xtuple<Types...>(args...) {}
enum { N = xtuple<Types...>::N + 1 };
};
template<typename T>
class xtuple<T> {
public:
T value;
xtuple() {}
xtuple(const T& a) : value(a) {}
enum { N = 1 };
};
template<typename T>
int xtuple_size(T& a) {
return T::N;
}
template<int N, typename T, typename ...Types>
struct xtuple_type;
// 0번째 타입을 요구할 때를 위한 부분 전문화
template<typename T, typename ...Types>
struct xtuple_type<0, xtuple<T, Types...>> {
typedef T type; // 0번째 요소의 타입
typedef xtuple<T, Types...> TupleType; // 0번째 튜플의 타입
};
// 0이 아닌 경우: N-1 번째를 재귀적으로 가져온다.
template<int N, typename T, typename ...Types>
struct xtuple_type<N, xtuple<T, Types...>> : xtuple_type<N - 1, xtuple<Types...>> {};
// 튜플에서 값을 꺼내는 함수
template<int N, typename ...Types>
typename xtuple_type<N, xtuple<Types...>>::type xget(xtuple<Types...>& t) {
return static_cast<xtuple_type<N, xtuple<Types...>>::TupleType>(t).value;
}
template<int N, typename T>
void print_type(const T& a) {
std::cout << typeid(xtuple_type<N, T>::type).name() << std::endl;
}
int main() {
xtuple<int, char, double, short> t4(1, 'c', 3.3, 4);
// value + 부모 멤버
// value + 부모 멤버
// value + 부모 멤버
// value + 부모 멤버
print_type<1>(t4); // char
std::cout << xget<2>(t4) << std::endl; // 3.3
}
댓글남기기