2009-11-19 3 views
3

Можно разбить вопрос на два: как читать и до написать шаблонный код.Как объяснить шаблоны C++ для младших разработчиков?

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

+0

Спасибо за ответы, они действительно полезны, даже если у них нет наивысшего балла –

ответ

7

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

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

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

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

+1

Когда я начинал, я написал весь класс списка, основанный на void *, прежде чем я понял шаблоны. Это был большой удар по лбу. –

4

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

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

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

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

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

+0

Вы цитировали это высказывание, а затем действительно не объяснили это своим ... – 2009-11-19 10:58:17

+0

OK, какой бит вам не пригодился? – janm

+3

Мне не имеет смысла говорить, что strustrup не понимает шаблонов, просто потому, что он не может объяснить их до одного года. Если это не то, что вы подразумеваете (то есть, что вопросник не понимает их), я не уверен, что вы хотите сказать, указав его. –

-1

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

2

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

2

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

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

+0

Почему downvote? Я нахожу аналогию с утиной типизацией, так как я испытал ее другим путем: как (в основном) C++-динамик, изучающий Ruby, я действительно понял, что они подразумевают под «утиным набором» в тот день, когда я сделал эту ссылку с шаблонами функций C++. –

+0

Я верю, что кто-то отказался от большинства ответов здесь. Я получил необъяснимый -1 в то же время, что и почти все остальные. – hrnt

2

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

2

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

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

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

1

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

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

Смежные вопросы