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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python17 124
  • Облачные технологии14 088
  • QA вакансии3 457
  • Backend вакансии2 116
  • Инженер данных1 805
  • Продакт-менеджер1 262

Разработка

  • Android1 866
  • iOS1 701
  • Fullstack вакансии988
  • AI вакансии952
  • Frontend вакансии744
  • Mobile вакансии44

По стеку

  • Go8 662
  • Java6 548
  • Node.js2 019
  • .NET1 722
  • Kotlin1 619
  • Rust1 454
  • C#711
  • PHP683
  • C++571

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

  • Kubernetes7 769
  • DevOps вакансии6 053
  • Linux-инфраструктура5 493
  • Terraform / IaC4 266
  • CI/CD3 242
  • Мониторинг и Observability1 788
  • SRE567
  • Кибербезопасность453

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

  • Data Scientist1 142
  • Бизнес-аналитик927
  • Аналитик данных854
  • Системный аналитик153

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

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

По регионам

  • Вакансии в США44 297
  • Вакансии в Европе23 854
  • Вакансии в Канаде4 476
  • Работа в России3 921

По формату

  • Удалённые вакансии75 046
  • Релокация в США44 297
  • Гибридная работа12 398
  • Офисная работа7 076

По уровню

  • Senior вакансии42 676
  • Middle вакансии20 894
  • Junior вакансии6 725

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

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis39 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 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++ вакансии
  • Lead DevOps Engineer - Warszawa
  • Senior Software Engineer – Web & Desktop Applications
  • STM32 Embedded Developer (C/C++)
  • Senior/Expert AppSec Engineer
  • Senior Golang-разработчик

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

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