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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python11 079
  • Облачные технологии8 824
  • QA вакансии2 977
  • Android1 395
  • Инженер данных1 032
  • Продакт-менеджер351

Разработка

  • Backend вакансии1 342
  • iOS1 307
  • AI вакансии660
  • Fullstack вакансии524
  • Frontend вакансии465
  • Mobile вакансии28

По стеку

  • Go6 622
  • Java3 670
  • Kotlin1 199
  • Node.js1 190
  • Rust1 181
  • .NET780
  • PHP329
  • C++301
  • C#211

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

  • Kubernetes5 251
  • Linux-инфраструктура4 138
  • DevOps вакансии3 024
  • Terraform / IaC2 834
  • Мониторинг и Observability1 406
  • CI/CD917
  • SRE389
  • Кибербезопасность40

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

  • Аналитик данных586
  • Бизнес-аналитик487
  • Data Scientist458
  • Системный аналитик75

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

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

По регионам

  • Вакансии в США31 201
  • Вакансии в Европе11 507
  • Работа в России3 630
  • Вакансии в Канаде2 546

По формату

  • Удалённые вакансии47 761
  • Релокация в США31 201
  • Гибридная работа7 699
  • Офисная работа6 071

По уровню

  • Senior вакансии27 027
  • Middle вакансии12 284
  • Junior вакансии4 495

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

Все компании
  • Wise196 вакансий
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis48 вакансий
  • Spotify38 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

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

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

Что такое templates в C++ и что такое template specialization?

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

Шаблоны генерируют код на этапе компиляции для каждого типа-аргумента. Полная специализация задаёт реализацию для конкретного типа (template<>); частичная специализация (только для классов) — для паттерна типов.

Шаблоны (Templates)

Шаблоны — механизм генерации кода во время компиляции. Компилятор создаёт отдельную копию функции или класса для каждого набора типовых аргументов (instantiation). Это статический полиморфизм без накладных расходов runtime.

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

// Функциональный шаблон
template<typename T>
T max_of(T a, T b) {
    return (a > b) ? a : b;
}

// Шаблон класса
template<typename T, size_t N>
class FixedArray {
    T data_[N];
public:
    T& operator[](size_t i) { return data_[i]; }
    const T& operator[](size_t i) const { return data_[i]; }
    constexpr size_t size() const { return N; }

    // Шаблонный метод внутри шаблонного класса
    template<typename U>
    void fill(U value) {
        for (auto& elem : data_) elem = static_cast<T>(value);
    }
};

void demo_basic() {
    auto m1 = max_of(3, 5);           // int
    auto m2 = max_of(3.14, 2.71);     // double
    auto m3 = max_of<std::string>("apple", "banana");

    FixedArray<int, 5> arr;
    arr.fill(42);
    std::cout << arr[0] << '\n';  // 42
}

Полная специализация (Full Specialization)

Полная специализация задаёт конкретную реализацию для конкретного набора аргументов:

// Основной шаблон
template<typename T>
struct TypeInfo {
    static const char* name() { return "unknown"; }
};

// Полная специализация для int
template<>
struct TypeInfo<int> {
    static const char* name() { return "int"; }
};

// Полная специализация для double
template<>
struct TypeInfo<double> {
    static const char* name() { return "double"; }
};

void demo_full_spec() {
    std::cout << TypeInfo<int>::name() << '\n';     // "int"
    std::cout << TypeInfo<double>::name() << '\n';  // "double"
    std::cout << TypeInfo<char>::name() << '\n';    // "unknown"
}

Частичная специализация (Partial Specialization)

Частичная специализация применяется только к шаблонам классов (не функций), позволяет специализировать по паттерну:

// Основной шаблон
template<typename T, typename U>
struct Pair {
    T first;
    U second;
    void print() { std::cout << "generic\n"; }
};

// Частичная специализация: оба типа одинаковы
template<typename T>
struct Pair<T, T> {
    T first;
    T second;
    void print() { std::cout << "same types\n"; }
};

// Частичная специализация для указателей
template<typename T>
struct Pair<T*, T*> {
    T* first;
    T* second;
    void print() { std::cout << "pointers\n"; }
};

void demo_partial_spec() {
    Pair<int, double> p1;  // generic
    Pair<int, int> p2;     // same types
    Pair<int*, int*> p3;   // pointers

    p1.print();  // generic
    p2.print();  // same types
    p3.print();  // pointers
}

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

  • Code bloat: каждая instantiation генерирует отдельный код — 100 типов = 100 копий функции в бинарнике. Используйте explicit instantiation или type erasure для горячих путей.
  • Ошибки компиляции нечитаемы: сообщение об ошибке внутри шаблона выдаёт несколько экранов текста. В C++20 requires (concepts) делает сообщения понятнее.
  • Частичная специализация функций: функции не поддерживают частичную специализацию — вместо неё используют перегрузку или вспомогательный шаблон класса.
  • Порядок специализаций: специализации должны быть объявлены до использования; компилятор выбирает «наиболее специфичную» — неоднозначность приводит к ошибке компиляции.
  • typename и template в зависимых контекстах: typename T::type и obj.template method<U>() — ключевые слова обязательны, иначе парсер трактует как сравнение.
  • Экспорт шаблонов в .cpp: тела шаблонов должны быть в заголовочных файлах (или явно instantiated в .cpp) — определение в .cpp без явной instantiation не сгенерирует код для других TU.
  • SFINAE vs Concepts: до C++20 для ограничения типов использовали std::enable_if — сложно и хрупко. В C++20 предпочитайте requires и concepts.

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

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

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

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

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

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

Источники

  • https://en.cppreference.com/w/cpp/language/templates
  • https://en.cppreference.com/w/cpp/language/template_specialization
←Предыдущий вопросКакие production-риски чаще всего возникают в проектах на C++: производительность, зависимости, конкурентность, деплой или observability?Следующий вопрос→Что такое `std::move` и `std::forward`?

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

C++Debuggingmemory-managementperformance-tradeoffs

Вакансии с этим навыком

C++ вакансии
  • Senior C++ Software Engineer (#5819)
  • Security Architect
  • Sr. Software Developer - C#/WPF for UI/UX Development
  • Data Scientist (NLP Deep Learning Engineer)
  • Manager, Engineering (Remote Eligible in Bulgaria)

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

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