Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+737новых вакансий за сутки·51 861вакансия открыта сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 706
РезюмеAIПодготовкаСтатьи
ТарифыТарифы
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 391 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python5 436
  • Облачные технологии4 071
  • QA вакансии1 587
  • Android1 093
  • Инженер данных782
  • Продакт-менеджер310

Разработка

  • iOS1 047
  • Backend вакансии986
  • Fullstack вакансии437
  • Frontend вакансии354
  • AI вакансии350
  • Mobile вакансии27

По стеку

  • Go2 987
  • Java1 810
  • Kotlin868
  • Node.js675
  • .NET436
  • Rust435
  • PHP248
  • C++204
  • C#190

DevOps и инфраструктура

  • Kubernetes2 306
  • Linux-инфраструктура1 890
  • DevOps вакансии1 675
  • Terraform / IaC1 405
  • CI/CD841
  • Мониторинг и Observability645
  • SRE217
  • Кибербезопасность46

Аналитика и данные

  • Аналитик данных476
  • Data Scientist450
  • Бизнес-аналитик341
  • Системный аналитик48

Другие направления

  • Проджект-менеджер103
  • UI/UX дизайн70
  • Ручное тестирование14

По регионам

  • Вакансии в США23 809
  • Вакансии в Европе9 134
  • Работа в России2 924
  • Вакансии в Канаде2 119

По формату

  • Удалённые вакансии41 654
  • Релокация в США23 809
  • Гибридная работа3 374
  • Офисная работа2 525

По уровню

  • Senior вакансии20 056
  • Middle вакансии11 874
  • Junior вакансии3 682

Сейчас нанимают

Все компании
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Wise71 вакансия
  • Infobip28 вакансий
  • Darktrace17 вакансий
  • Spotify14 вакансий
  • Celonis11 вакансий
  • Razorpay9 вакансий
  • Adyen8 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме C++Все вопросы
C++SeniorКодинг

Что такое variadic templates?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Variadic templates (C++11) принимают произвольное число типовых аргументов через parameter packs (typename... Args). До C++17 раскрываются рекурсией; в C++17 fold expressions (args + ...) делают это однострочно без рекурсии.

Что такое variadic templates

Variadic templates (C++11) — шаблоны с переменным числом типовых параметров (parameter packs). Позволяют писать функции и классы, принимающие произвольное количество аргументов любых типов, при полной проверке типов на этапе компиляции.

#include <iostream>
#include <string>
#include <tuple>
#include <memory>

// sizeof... — количество элементов в пакете
template<typename... Args>
void count_args(Args... args) {
    std::cout << "count: " << sizeof...(args) << '\n';
}

// Рекурсивное раскрытие (базовый случай + рекурсия)
void print() {}  // базовый случай: ноль аргументов

template<typename T, typename... Rest>
void print(T first, Rest... rest) {
    std::cout << first << ' ';
    print(rest...);  // рекурсия с оставшимися аргументами
}

// C++17 fold expressions — намного лаконичнее рекурсии
template<typename... Args>
void print_fold(Args... args) {
    // унарный правый fold: (args << ... ) — нет; используем запятую
    ((std::cout << args << ' '), ...);
    std::cout << '\n';
}

template<typename... Args>
auto sum(Args... args) {
    return (args + ...);  // fold expression: a + b + c + ...
}

template<typename... Args>
bool all_positive(Args... args) {
    return ((args > 0) && ...);  // all-of fold
}

// Практический пример: аналог std::make_unique
template<typename T, typename... Args>
std::unique_ptr<T> my_make_unique(Args&&... args) {
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}

// Вариадический класс: std::tuple реализован так
template<typename... Types>
struct MyTuple;  // forward declaration

template<>
struct MyTuple<> {};  // base case

template<typename Head, typename... Tail>
struct MyTuple<Head, Tail...> : MyTuple<Tail...> {
    Head value;
    explicit MyTuple(Head h, Tail... t)
        : MyTuple<Tail...>(t...), value(h) {}
};

// Logging с типами (реальный use-case)
template<typename... Args>
void log(const char* fmt, Args&&... args) {
    // В реальном коде: fmt::format или std::format (C++20)
    // Здесь упрощённо:
    ((std::cout << std::forward<Args>(args) << ' '), ...);
    std::cout << '\n';
}

int main() {
    count_args(1, "hello", 3.14);  // count: 3
    print(1, 2.5, "three");        // 1 2.5 three
    print_fold(10, 20, 30);        // 10 20 30

    std::cout << sum(1, 2, 3, 4, 5) << '\n';       // 15
    std::cout << all_positive(1, 2, 3) << '\n';    // 1
    std::cout << all_positive(1, -2, 3) << '\n';   // 0

    struct Point { int x, y; };
    auto p = my_make_unique<Point>(1, 2);

    log("Values:", 42, "text", 3.14f);
}

Fold expressions (C++17)

Четыре вида fold:

  • Унарный левый: (... op pack) → ((a op b) op c)
  • Унарный правый: (pack op ...) → (a op (b op c))
  • Бинарный левый: (init op ... op pack)
  • Бинарный правый: (pack op ... op init)

Подводные камни

  • Глубокая рекурсия без fold: до C++17 рекурсивные variadic шаблоны генерируют глубокую цепочку инстанциаций — медленная компиляция и возможное превышение лимита глубины шаблонов (обычно 900).
  • Порядок вычислений в fold: для operator, порядок гарантирован слева направо, для + — нет (применяйте бинарный fold с осторожностью для операций с побочными эффектами).
  • Пустой пакет и fold: унарный fold с пустым пакетом допустим только для && (→ true), || (→ false) и , (→ void); для + с пустым пакетом — ошибка компиляции.
  • Раскрытие в инициализаторе: int arr[] = {(expr(args), 0)...}; — старый трюк для гарантии порядка; с C++17 используйте fold с запятой.
  • SFINAE и variadic: ошибки внутри инстанциации пакета дают трудночитаемые сообщения; в C++20 используйте concepts и requires.
  • Перегрузка vs специализация: нельзя частично специализировать variadic функцию — используйте перегрузку или вспомогательный шаблон класса.
  • Производительность компиляции: вариадические шаблоны с большим числом аргументов (100+) резко замедляют компиляцию; для таких случаев рассмотрите type erasure или std::initializer_list.

Частые вопросы на собеседовании

  • Что такое undefined behavior в C++ и приведите примеры?
  • Что такое smart pointers в C++? Объясните unique_ptr, shared_ptr и weak_ptr.
  • Что такое правило трёх / правило пяти / правило нуля (Rule of Three / Five / Zero)?
  • Что такое RAII (Resource Acquisition Is Initialization) и почему это важно?

Типичные ошибки

  • Объяснять variadic templates только по синтаксису, без жизненного цикла и стоимости.
  • Игнорировать ошибки, null/empty состояния, порядок инициализации или режим сборки.
  • Давать пример, который работает в демо, но ломается при изменении владельца ресурса.
  • Показывать сырой указатель без объяснения владельца и момента освобождения.

Что проверяет интервьюер

  • Кандидат формулирует точную модель для variadic templates, а не только определение.
  • Пример компилируем, безопасен по lifetime и соответствует версии технологии.
  • Названы trade-off, ограничения и диагностируемые симптомы ошибки.

Как вы знаете этот вопрос?

Проверить себя по теме C++ →

Источники

  • https://en.cppreference.com/w/cpp/language/parameter_pack

Связанные темы

C++Debuggingmemory-managementperformance-tradeoffs