Skip to content

Instantly share code, notes, and snippets.

@nekko1119
Created November 25, 2013 20:11
Show Gist options
  • Save nekko1119/7647994 to your computer and use it in GitHub Desktop.
Save nekko1119/7647994 to your computer and use it in GitHub Desktop.
tupleの簡易実装試してみた。テンプレートパラメータのintはstd::size_tの方が良いと思うけど面倒臭かったのでint。計算量はO(N)だけどtupleってO(logN)で実装可能なんですかね?
template <typename... Args>
class tuple;
template <int Index, typename Tuple>
struct tuple_element;
template <int N, typename... Args>
typename tuple_element<N, tuple<Args...>>::type& get(tuple<Args...>& t);
template <typename Head, typename... Tails>
class tuple<Head, Tails...>
: public tuple<Tails...>
{
template <int N, typename... Args>
friend typename tuple_element<N, tuple<Args...>>::type& get(tuple<Args...>& t);
Head value;
};
template <>
class tuple<>
{
};
template <int Index, typename Head, typename... Tails>
struct tuple_element<Index, tuple<Head, Tails...>>
: tuple_element<Index - 1, tuple<Tails...>>
{
};
template <typename Head, typename... Tails>
struct tuple_element<0, tuple<Head, Tails...>>
{
using type = Head;
using tuple_type = tuple<Head, Tails...>;
};
template <int N, typename... Args>
typename tuple_element<N, tuple<Args...>>::type& get(tuple<Args...>& t)
{
return static_cast<tuple_element<N, tuple<Args...>>::tuple_type&>(t).value;
}
int main()
{
tuple<int, char, int*> t;
get<0>(t) = 42;
get<1>(t) = '\n';
get<2>(t) = nullptr;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment