Судя по комментарию к Перебирая короткий фиксированный список строк, оказывается, что в современном C++ можно написать:
for (auto color: {"red", "green", "blue"})
Можете ли вы сделать что-то подобное с вызовом функции, и если да, то каков соответствующий синтаксис объявления параметра? Другими словами,
void foo( /* ... */ )
foo({"red", "green", "blue"});
Чем заменить ...?
Ответ на этот вопрос очевиден, если вы понимаете, почему комментарии работают.





Да, ты можешь. Обычный способ — объявить foo как принимающий initializer_list, например:
#include <iostream>
#include <string>
#include <initializer_list>
void foo (std::initializer_list <std::string> il)
{
for (const auto &s : il)
std::cout << s << " ";
}
int main()
{
foo ({"red", "green", "blue"});
}
Обратите внимание, что, например, у std::vector именно такой конструктор и что все объекты в списке должны быть одного типа.
Вы также можете сделать это с помощью шаблона функции:
#include <string_view>
#include <iostream>
template<std::size_t N>
void foo(const std::string_view(&strings)[N])
{
for (const auto string : strings)
{
std::cout << string << "\n";
}
}
int main()
{
foo({ "red","green","blue" });
return 0;
}
Вот альтернатива с пакетом параметров и выражением fold:
#include <iostream>
#include <utility>
template <class... Args>
void foo(Args&&...args) {
(..., (std::cout << std::forward<Args>(args) << ' '));
}
int main() {
foo("red", "green", "blue");
}
ИМХО, это самое идиоматическое решение С++ 20. Великолепно @Ted
@πάνταῥεῖ Спасибо! Я думал свернуть && вместо того, чтобы свернуть , для короткого замыкания в случае ошибок при печати, но ... это показалось мне слишком :-)
Я бы хотел, чтобы ОП правильно редактировал и улучшал свой исходный вопрос, который кажется подходящей целью для ответов. Меня устраивает достаточное количество повторных голосов здесь, но со стороны OP еще предстоит проделать еще некоторую работу.
Одним из подходящих параметров является std::ranges::range начиная с С++-20. Также избегайте копий при повторении:
for (const auto& color: {"red", "green", "blue"})лучше.