использование decltype с пакетом параметров для C ++ 11 - PullRequest
0 голосов
/ 16 сентября 2018

Я пытаюсь получить код multi_index_t из второго ответа здесь , на который ответил davidhigh, для работы с C ++ 11.C ++ 11 не поддерживает возвраты типа auto&.

Я преобразовал типы возврата для класса, но я не понимаю, как / если возможно поддерживать вспомогательную функцию multi_index() без использования C++ 14.

Код:

#include<array>

template<int dim>
struct multi_index_t
{
  std::array<int, dim> size_array;
  template<typename ... Args>
  multi_index_t(Args&& ... args) : size_array(std::forward<Args>(args) ...) {}

  struct iterator
  {
    struct sentinel_t {};
    std::array<int, dim> index_array = {};
    std::array<int, dim> const& size_array;
    bool _end = false;

    iterator(std::array<int, dim> const& size_array) : size_array(size_array) {}

    iterator& operator++() 
    {
      for (int i = 0;i < dim;++i)
      {
        if (index_array[i] < size_array[i] - 1)
        {
          ++index_array[i];
          for (int j = 0;j < i;++j) { index_array[j] = 0; }
          return *this;
        }
      }
      _end = true;
      return *this;
    }
    std::array<int, dim>& operator*()  { return index_array; }
    bool operator!=(sentinel_t) const { return !_end; }
  };

  iterator begin() const { return iterator{ size_array }; }
  iterator end() const { return typename iterator::sentinel_t{}; }
};


template<typename ... index_t>
auto multi_index(index_t&& ... index) // <-- this doesn't compile
{
  static constexpr int size = sizeof ... (index_t); 
  auto ar = std::array<int, size>{std::forward<index_t>(index) ...};
  return multi_index_t<size>(ar);
}

Согласно этому ответу , вы не можете рекурсивно расширить шаблон функции с помощью decltype().Есть идеи?

1 Ответ

0 голосов
/ 16 сентября 2018

C ++ 11 не поддерживает возвраты типа auto&.

Так что вы можете просто указать типы.

Для multi_index() у вас есть возвращаемое значение multi_index_t<size>, где size равно sizeof...(index_t), поэтому вы можете написать

template<typename ... index_t>
multi_index_t<sizeof...(index_t)> multi_index(index_t&& ... index)

Согласно этому ответу, вы не можете рекурсивно развернуть шаблон функции с помощью decltype.

Правильно, но я не вижу рекурсии в вашей multi_index() функции, поэтому не вижу, как применить рекурсию к decltype().

Если вы действительно хотите (но почему?), Вы можете явно указать возвращаемый тип через decltype() следующим образом

template<typename ... index_t>
auto multi_index(index_t&& ... index)
   -> decltype( multi_index_t<sizeof...(index_t)>
                   { std::array<int, sizeof...(index_t)>
                        {{ std::forward<index_t>(index) ... }} } )

но я не вижу причины делать это вместо просто явного multi_index_t<sizeof...(index_t)>

...