下面是实现一个元组的简单思路
代码如下:
#ifndef MY_TUPLE_HPP
#define MY_TUPLE_HPP
template <typename... Args>
class my_tuple {};
template <typename T>
class my_tuple<T>
{
public:
typedef my_tuple<> base_type;
typedef my_tuple<T> this_type;
typedef T element_type;
my_tuple(const T& t) : element_(t) {}
T& get()
{
return element_;
}
private:
T element_;
};
template <typename T, typename... Args>
class my_tuple<T, Args...> : public my_tuple<Args...>
{
public:
typedef my_tuple<Args...> base_type;
typedef my_tuple<T, Args...> this_type;
typedef T element_type;
my_tuple(const T& t, Args... args) : base_type(args...), element_(t) {}
T& get()
{
return element_;
}
private:
T element_;
};
template <size_t N, typename T, typename... Args>
struct select {};
template <typename T, typename... Args>
struct select<0, my_tuple<T, Args...>>
{
typedef my_tuple<T, Args...> this_type;
typedef T element_type;
};
template <size_t N, typename T,typename... Args>
struct select<N, my_tuple<T, Args...>>
{
typedef typename select<N - 1, my_tuple<T, Args...>>::this_type::base_type this_type;
typedef typename select<N - 1, my_tuple<T, Args...>>::this_type::base_type::element_type element_type;
};
template <typename... Args>
struct counter {};
template <>
struct counter<>
{
static const size_t count = 0;
};
template <typename T, typename... Args>
struct counter<T, Args...>
{
static const size_t count = counter<Args...>::count + 1;
};
template <size_t N, typename... Args>
typename select<N, my_tuple<Args...>>::element_type&
my_tuple_get(my_tuple<Args...>& tup)
{
return (static_cast<typename select<N, my_tuple<Args...>>::this_type&>(tup)).get();
}
template <typename... Args>
my_tuple<Args...> make_my_tuple(Args... args)
{
typedef my_tuple<Args...> tuple_type;
return tuple_type(args...);
}
template <typename... Args>
size_t get_my_tuple_size(my_tuple<Args...>& tup)
{
return counter<Args...>::count;
}
#endif