Есть несколько способов. Самый простой способ - использовать структурную рекурсию, как это делает LISP: кортеж либо
- пустой кортеж или
- пара
(head, tail)
, где head
- первый элемент кортежа, а tail
- кортеж, содержащий остальные элементы.
В C ++ это будет выглядеть следующим образом:
template <typename... Elems>
struct tuple; // undefined
template <>
struct tuple<> { }; // empty tuple
template <typename Head, typename... Tail>
struct tuple<Head, Tail...> {
Head first_elem;
tuple<Tail...> rest;
};
Затем вам нужен шаблон функции get<n>
для фактического доступа к элементам по индексу; это должно быть довольно легко реализовать, если вы поймете, как рекурсивно определяется сам кортеж.
Как я уже говорил, существуют другие, более хитрые, методы реализации - по разным причинам вышеприведенное не так, как это делают большинство реализаций std::tuple
.