Как мне расширить integer_sequence? - PullRequest
3 голосов
/ 14 июня 2019

У меня есть функция, которая выглядит следующим образом:

template <typename T, std::size_t... I>
std::ostream& vector_insert(std::ostream& lhs, const char* delim, const T& rhs, std::index_sequence<I...>) {
    std::ostream_iterator<float> it(lhs, delim);

    ((*it++ = at(rhs, I)), ...);
    return lhs;
}

Это моя последняя попытка, и я все еще терплю неудачу в расширении integer_sequence Я надеюськто-то может сказать мне, как написать строку, которая будет эффективно расширяться до:

*it++ = at(rhs, 0U), *it++ = at(rhs, 1U), *it++ = at(rhs, 2U)

Другие вещи, которые я пробовал:

  1. *it++ = at(rhs, I...)
  2. *it++ = at(rhs, I)...
  3. (*it++ = at(rhs, I))...

Все они дают мне ошибку:

Ошибка C3520: I: пакет параметров должен бытьрасширен в этом контексте

Как мне развернуть эту вещь?

РЕДАКТИРОВАТЬ:

@ AndyG указал что это, похоже, ошибка .

1 Ответ

2 голосов
/ 14 июня 2019

Это похоже на ошибку компилятора в Visual C ++. Я не знаю ни одного легкого решения для этого, кроме упрощения выражения, в котором расширен пакет параметров. Переход к рекурсивному подходу, кажется, надежно обходит проблему. Например:

#include <array>
#include <iostream>
#include <iterator>

template <typename T>
const auto& at(const T& v, size_t i) { return v[i]; }

// End of recursion
template<class T>
void vector_insert_impl(std::ostream_iterator<int> &, const char*, const T&)
{}

// Recursion case
template<class T, std::size_t N, std::size_t... I>
void vector_insert_impl(std::ostream_iterator<int> & iter, const char* delim, const T&rhs)
{
    *iter++ = at(rhs, N);

    // Continue the recursion
    vector_insert_impl<T, I...>(iter, delim, rhs);
}

template <typename T, std::size_t... I>
std::ostream& vector_insert(std::ostream& lhs, const char* delim, const T& rhs, std::index_sequence<I...>) 
{
    std::ostream_iterator<int> it(lhs, delim);

    // Call the recursive implementation instead
    vector_insert_impl<T, I...>(it, delim, rhs);

    return lhs;
}

int main() {
    std::array<int, 5> v = { 1, 2, 3, 4, 5 };
    vector_insert(std::cout, " ", v, std::make_index_sequence<v.size()>());
}

Здесь пакет параметров I раскрывается только в контексте предоставления параметров шаблона, с которыми у VC ++ нет проблем.

...