TGViewer
Сіпласпластик Сіпласпластик @cpplastic · 739 subscribers
Post #502 885
Думав написати про це ще минулої середи, але ви мені тоді точно не повірили би 😄

Отже, в C++ тепер є новий різновид циклів — template for 🙂 Хочемо, ми, наприклад, написати функцію зі змінною кількістю аргументів, яка виводитиме значення в консоль:
template <typename... Ts> void print_all(Ts... elems);

print_all("foo", 42, 'p', 3.14); // використання


Раніше довелось би писати щось отаке:
template <typename... Ts> 
void print_all(Ts... elems)
{
(std::println("{}", elems), ...);
}


Ніби й зрозуміло, що elems розпаковуються в пачку виразів, кожний з яких — це println, але читається не дуже. Тому знавці використовували би, мабуть, 🐝 Boost.Hana. А в C++11 взагалі колись писали отак:
void print_all() {}

template <typename T, typename... Ts>
void print_all(T first, Ts... rest) {
std::cout << first << std::endl;
print_all(rest...);
}

Тобто типовий ФП-підхід, де список ділиться на head:[tail] й обходиться рекурсивно, доки не дійде до порожнього.

А тепер можна буде писати отак:
template <typename... Ts>
void print_all(Ts... elems) {
template for (auto elem : {elems...}) {
std::println("{}", elem);
}
}


Усе це розгортається під час компіляції в щось на кшталт:
template <typename... Ts>
void print_all(Ts... elems) {
{
{
auto elem = elems...[0]; // така індексація,
// до речі, також
// нова фіча
std::println("{}", elem);
}
{
auto elem = elems...[1];
std::println("{}", elem);
}
{
auto elem = elems...[2];
std::println("{}", elem);
}
}
}


Працює template for не лише з пачками типів, але й з будь-чим. Наприклад, звичайними масивами. Так
void f() {
template for (constexpr int I : std::array{1, 2, 3}) {
static_assert(I < 4);
}
}

перетворюється на
void f() {
{
constexpr auto&& __range = std::array{1, 2, 3};
constexpr auto __begin = __range.begin();
constexpr auto __expansion_size = __range.end() - __begin; // 3

{
constexpr int I = *(__begin + 0);
static_assert(I < 4);
}

{
constexpr int I = *(__begin + 1);
static_assert(I < 4);
}

{
constexpr int I = *(__begin + 2);
static_assert(I < 4);
}
}
}


Ну й ще багато чого можна робити звісно. Проте найкраще ця штука себе показує з новою рефлексією, про котру ще згодом напишу.
  • ❤‍🔥 7
  • 👍 5
  • 🤯 2
  • 🔥 1
  • 🤔 1
  • 🤣 1
More from @cpplastic
  1. Oct 7, 2026Post #543
  2. Oct 2, 2026Щось не злетіло з self-driving cars у автовиробників, еге ж? А стільки галасу було. Ну зат…
  3. Sep 24, 2026Ух, яку ж класну доповідь подивився: «Scott Jenson: Are we really going to use the same De…
  4. Sep 23, 2026Post #540
  5. Sep 21, 2026«Порекламую» вам український сайт, який мені дуже подобається. Взяв слово в лапки, бо як і…
  6. Sep 18, 2026Ви ж знаєте, що я полюбляю Tailscale 💠 попри те, що недоліків у них теж вистачає? Але сам…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →