Отправка пакета параметров шаблона в std :: basic_ostream - PullRequest
0 голосов
/ 24 февраля 2020

Пример кода на странице cppreference для std::integer_sequence:

template<typename T, T... ints>
void print_sequence(std::integer_sequence<T, ints...> int_seq)
{
    std::cout << "The sequence of size " << int_seq.size() << ": ";
    ((std::cout << ints << ' '),...);
    std::cout << '\n';
}

Я не совсем понимаю синтаксис ((std::cout << ints << ' '),...). Я не вижу перегруженных версий std :: basic_ostream :: operator << `, которые бы приняли пакет параметров шаблона variadi c. </p>

Что именно здесь происходит и как оно работает?

Ответы [ 2 ]

2 голосов
/ 24 февраля 2020

Я не совсем понимаю синтаксис ((std::cout << ints << ' '),...). Я не вижу перегруженных версий std::basic_ostream::operator<<, в которых бы содержался пакет параметров шаблона variadi c.

Что именно здесь происходит и как оно работает?

Если я не ошибаюсь, это называется «выражение сгиба» , но вы также можете найти его как «сворачивание шаблона» или просто «сворачивание».

Доступно, начиная с C + + 17.

Идея заключается в применении оператора над пакетом значений c.

Класси c Пример: сумма.

Если вы хотите Сумма вашего ints, вы можете применить оператор + следующим образом

( ints + ... );

В вашем случае выражение складывания применяется над оператором запятой.

Итак, если ints... - это (например) 2, 3, 5, 7, ваше выражение:

((std::cout << ints << ' '),...);

эквивалентно

(std::cout << 2 << ' '), (std::cout << 3 << ' '), (std::cout << 5 << ' '), (std::cout << 7 << ' ');
1 голос
/ 24 февраля 2020

operator<< не нужно принимать пакет параметров variadi c, чтобы это работало. Здесь на самом деле происходит то, что, например, для 3 целых чисел эта строка будет расширяться примерно так:

(
  (std::cout << int1 << ' '),
  (std::cout << int2 << ' '),
  (std::cout << int3 << ' ')
);

Оператор , гарантирует порядок выполнения слева направо.

...