Шаблоны (templates) — механизм C++, позволяющий создавать обобщённые классы и функции, работоспособные с различными типами данных без дублирования кода. Это основа реализации контейнеров STL, алгоритмов и многих паттернов обобщённого программирования.
Типы шаблонов:
Пример шаблона класса:
template<typename T> class Box { public: Box(T value): data(value) {} T get() const { return data; } private: T data; };
Пример шаблона функции:
template<class T> T add(const T& a, const T& b) { return a + b; }
Можно ли явным образом специализировать только один метод шаблонного класса, не специализируя весь класс? Если да, как это делается?
Ответ:
Да, можно. Необязательно специализировать весь класс; можно просто специализировать отдельный метод:
template <typename T> class Foo { public: void bar(); }; template <> void Foo<int>::bar() { // Специализация только метода bar для int // Реализация }
История
В проекте был написан шаблон функции для сравнения:template <typename T> bool cmp(const T& a, const T& b) { return a < b; }При использовании с типами, не имеющими оператора
<, возникла ошибка компиляции, которую долго искали, т.к. диагностика выдавалась только при инстанцировании шаблона, а не в месте его определения.
История
Разработчик пытался использовать в шаблонной функции сложение для пользовательского класса, забыв перегрузить оператор+. Это привело к ошибкам компиляции при первом же вызове с этим классом.
История
При разработке контейнера на основе шаблона класса был сделан метод, который не зависел от типа шаблона, но был вынесен за пределы класса без явной специализации:template<> int MyContainer<int>::size() const { ... }Это привело к ошибке компоновки, потому что специализация объявилась, но не была реализована корректно для всех типов.