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

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

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 135
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти
←К подготовке по вакансии←К теме 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.

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

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

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

  • Объяснять 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 Software/Firmware Engineer
  • Software Developer (m/w/d)
  • ML Data Software Engineer
  • Senior C++ Software Engineer (#5819)
  • Senior C/C++ Developer

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

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

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

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

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

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

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

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

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

Все подборки
  • Python15 974
  • Облачные технологии12 746
  • QA вакансии3 431
  • Backend вакансии1 983
  • Инженер данных1 590
  • Продакт-менеджер1 097

Разработка

  • Android1 792
  • iOS1 660
  • AI вакансии924
  • Fullstack вакансии835
  • Frontend вакансии702
  • Mobile вакансии36

По стеку

  • Go8 484
  • Java5 803
  • Node.js1 814
  • Kotlin1 510
  • .NET1 432
  • Rust1 405
  • PHP591
  • C#500
  • C++450

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

  • Kubernetes7 088
  • DevOps вакансии5 330
  • Linux-инфраструктура5 148
  • Terraform / IaC3 908
  • CI/CD2 190
  • Мониторинг и Observability1 724
  • SRE539
  • Кибербезопасность367

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

  • Data Scientist977
  • Бизнес-аналитик828
  • Аналитик данных809
  • Системный аналитик111

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

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

По регионам

  • Вакансии в США44 024
  • Вакансии в Европе19 966
  • Вакансии в Канаде4 349
  • Работа в России3 875

По формату

  • Удалённые вакансии72 075
  • Релокация в США44 024
  • Гибридная работа10 789
  • Офисная работа6 889

По уровню

  • Senior вакансии39 966
  • Middle вакансии19 556
  • Junior вакансии6 496

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

Все компании
  • Wise194 вакансии
  • Rakuten189 вакансий
  • ASML164 вакансии
  • Grab134 вакансии
  • Celonis45 вакансий
  • Spotify37 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo19 вакансий
  • Darktrace17 вакансий

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

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