Как получить элементы из кортежа с переменными числами? - PullRequest
0 голосов
/ 21 ноября 2011

Итак, я создал простой класс кортежей с использованием шаблонов с переменными параметрами ...

Как мне сделать работающий метод get / вспомогательную функцию? Текущий, который я использую, заставляет компилятор ожидать, что его определят в пустом кортеже.

Вот код:

template<typename... T>
class tuple;

template< > 
class tuple< > { };

template<typename U, typename... T>
class tuple<U, T...>
{
public:
  tuple () {};
  tuple (U f, T... r);

  U get (int idx, int numCalls = 0) const;

  U first_;
  tuple<T...> rest_;
};

template<typename U, typename... T>
tuple<U, T...>::tuple (U f, T... r)
{
  first_ = f;
  rest_ = tuple<T...> (r...);
}

template<typename U, typename... T>
U tuple<U, T...>::get (int idx, int numCalls) const
{
  if (idx == numCalls)
    return first_;

  return rest_.get (idx, numCalls + 1);
}

Спасибо за любую помощь!

Ответы [ 2 ]

1 голос
/ 21 ноября 2011

Добавьте специализацию для одного типа, а также для нулевых типов:

template <typename T>
class tuple
{
  T first_;

  // get() ...
}

Обратите внимание, что ваш дизайн чрезвычайно неэффективен.Прежде всего, индекс get действительно должен быть параметром константы во время компиляции, поэтому вы хотите get<i> (как это делает std::tuple).Ваш код времени выполнения не содержит проверки ошибок, и недопустимый вызов не может быть обнаружен во время компиляции.Во-вторых, все ваши конструкторы выполняют большое количество копий, которые, вероятно, следует изменить, чтобы обеспечить идеальную пересылку.

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

Чтобы ваш текущий код работал, сделайте функцию get в пустом кортеже, ничего не возвращающую.
В качестве альтернативы, лучшее решение это сделать с параметром числа аргументов, которые вам нравятся:

template<typename U, int N>
U get()

и затем заставьте его пройти вперед с уменьшенным N, а когда N - 0, специализируйте его для возврата элемента.

...