Я делаю класс кортежей в C ++ 11 с использованием шаблонов с переменным числом аргументов.Как мне работать с его переменными экземпляра? - PullRequest
1 голос
/ 19 ноября 2011

Итак, я определяю кортеж как таковой:

template<typename... Args>
class Tuple 
{
    Method () {...};
};

Как определить и получить доступ к переменным экземпляра для Tuple, учитывая, что их может быть неопределенное количество?

Ответы [ 2 ]

9 голосов
/ 19 ноября 2011

Есть несколько способов. Самый простой способ - использовать структурную рекурсию, как это делает 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.

0 голосов
/ 19 ноября 2011

Я думаю, что самый простой способ - использовать библиотеку буст-кортежей - простой в использовании, хорошо протестированный и задокументированный:

http://www.boost.org/doc/libs/1_48_0/libs/tuple/doc/tuple_users_guide.html

...