Как объяснить шаблоны C ++ начинающим разработчикам? - PullRequest
4 голосов
/ 19 ноября 2009

Можно разбить вопрос на две части: как прочитать и написать шаблонный код.

Очень легко сказать: «если вам нужен массив значений типа double, напишите std::vector<double>», но это не научит их, как работают шаблоны.

Ответы [ 8 ]

8 голосов
/ 19 ноября 2009

Я бы, вероятно, попытался продемонстрировать мощь шаблонов, демонстрируя раздражение от их использования.

Хорошей демонстрацией было бы написать что-то простое, например стек двойных значений (рукописный, а не STL), с методами push, pop и foldTopTwo, которые всплывают и складывают два верхних значения в стеке, возвращает новое значение обратно.

Затем скажите им, чтобы они делали то же самое для целых чисел (или чего-то еще, только для другого числового типа).

Затем покажите им, как, записав этот стек в качестве шаблона, вы можете значительно сократить количество строк кода и все это ужасное дублирование.

4 голосов
/ 19 ноября 2009

Есть поговорка: «Если ты не можешь это объяснить, ты не понимаешь».

Вы можете разбить его дальше: как писать код, который использует шаблонный код, и как писать код, который предоставляет шаблонную услугу другим.

Основное объяснение состоит в том, что шаблоны генерируют код на основе шаблона. Это источник термина «метапрограммирование». Это программирование, как программирование должно быть сделано.

Существенная сложность вектора заключается не в том, что он является вектором типа double (или типа T), а в том, что он является вектором. Базовая структура та же самая, и шаблоны отделяют то, что не соответствует.

Дальнейшее объяснение зависит от того, насколько это имеет смысл для вас!

2 голосов
/ 19 ноября 2009

Я бы заставил их самостоятельно что-то реализовать, а затем поэкспериментировал бы с различными вариантами, пока они не поймут это. Обучение на практике - почти всегда лучший вариант в программировании.

Например, заставить их создать шаблон, который сравнивает два значения и возвращает более высокое. Затем пусть они увидят проходящие целые или двойные числа или все, что еще позволяет ему работать. Затем заставьте их настроить код / ​​скопировать его и вернуть минимальное значение. Опять же, поэкспериментируйте с вариациями - шаблон позволит им передавать int и double, или он будет жаловаться?

Оттуда вы можете передавать их в массивы любого типа (int, double и т. Д.), А также сортировать массив по возрастанию и убыванию, что снова стимулирует эксперименты. Оттуда начните переходить к шаблонным определениям классов, используя те же идеи, но в более широком масштабе. Это довольно много, как я узнал о шаблонах, заканчивая сложными классами манипулирования массивами для универсальных типов.

2 голосов
/ 19 ноября 2009

Представьте их как расширенные макросы. Это отдельный язык программирования, который выполняется во время компиляции.

2 голосов
/ 19 ноября 2009

Мне показалось очень поучительным смотреть на утки. Там не имеет значения, какой тип аргумента вы предоставляете функции, если они предлагают правильный интерфейс.

Шаблоны позволяют делать то же самое: вы можете выбрать любой тип, если присутствует правильный интерфейс. Дополнительное преимущество по сравнению с типизацией утки заключается в том, что интерфейс проверяется во время компиляции.

2 голосов
/ 19 ноября 2009

ИМХО лучше всего объяснить их как (очень) причудливые макросы. Они просто работают на более высоком уровне, чем макросы замены текста в стиле C.

1 голос
/ 19 ноября 2009

Когда я учил себя C ++, я часто использовал этот сайт . Это объясняет шаблоны в глубину и очень хорошо. Я бы посоветовал им прочитать это и попробовать реализовать что-то простое.

Для более краткого объяснения: шаблоны - это каркасы для сложных конструкций, которые действуют на данные, не зная что такое эти данные. Приведите им несколько примеров простого шаблона (например, связанного списка) и узнайте, как этот шаблон используется для создания окончательного класса.

0 голосов
/ 19 ноября 2009

Вы можете сказать, что шаблон является наполовину написанным источником с параметрами, которые должны быть заполнены при создании шаблона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...