Сотрудники офиса подсчитали что.

Хотя стандарты шаблонов опубликованы уже давно, они все еще распространены недостаточно широко. Конечно, трудно использовать нечто, не поддерживаемое вашим компилятором, - наверное, это первая причина, по которой большинство программистов C++ не умеет работать с шаблонами. К счастью, сейчас все основные компиляторы уже вошли в двадцатый век, так что эта проблема уже отпала. Остается лишь понять, что такое шаблон, как обойти все синтаксические ловушки, но прежде всего - для чего он все-таки нужен. Эта глава не ограничивается обзором синтаксиса. В ней также рассматриваются основы безопасности типов в C++, причем особое внимание уделяется шаблонам.

Что такое шаблоны и зачем они нужны?

Интерфейс простого класса-коллекции (на примере связанного списка) выглядит так:

class ListNode { private:

ListNode* next; void* data;

ListNode(void* d, ListNode* n = NULL) : next(n), data(d) {} ~ListNode() { delete next; }

void* Data() { return data; } ListNode* Next() { return next; }

Заметили что-нибудь особенное?

Проблемы

Прежде всего, в глаза бросаются все эти void* . И вы, и я прекрасно знаем, что на самом деле за ними кроется нечто совершенно иное. Где-то в клиентском коде придется сделать что-нибудь подобное:

for (ListNode* n = listHead; n != NULL; n = n->Next()) f((Foo*)n->Data());

Иначе говоря, вам придется постоянно приводить void* к конкретному типу Но как убедиться в том, что полученный указатель действительно имеет типFoo* ? Здесь придется рассчитывать только на себя, потому что компилятор со словами «Надеюсь, ты знаешь, что делаешь» умывает руки. Допустим, вы уверены, что ваше использование класса надежно по отношению к типам. Но можно ли гарантировать, что другой программист не выкинет какую-нибудь глупость и не занесет в коллекцию объект другого типа? Если вы свято верите в это, я рекомендую держаться подальше от рискованных инвестиций и вложить деньги в правительственные бумаги, вряд ли вам повезет в этой жизни.

Вторая проблема заключается в том, что элементы списка не знают, на какой тип они указывают. Предположим, вам хочется, чтобы деструктор списка удалял не только сами узлы, но и данные, на которые они ссылаются. Нельзя передать оператору delete указательvoid* и надеяться, что он сам выберет нужный деструктор.

Обходные решения

Одно из возможных решений - потребовать, чтобы все объекты вашей коллекции происходили от общего предка. В этом случае void* можно будет заменить указателем на базовый класс, создавая хотя бы видимость порядка. Если деструктор базового класса является виртуальным, по крайней мере мы сможем переписать деструкторListNode так, чтобы при самоубийстве он уничтожал и содержимое списка. Но если этот базовый класс имеет производные классы, вы наверняка вернетесь к необходимости выполнения ненадежных операций приведения к этим производным типам.

Другое обходное решение - создать список, рассчитанный на конкретный тип. Скажем, для ведения списка объектов класса Foo создается класс-коллекция ListOfFoos . В этом случае вам не придется выполнять приведения типов, еслиFoo не имеет производных классов. Но стоит ли плодить классыдвойники, которые отличаются только типами, с которыми они работают? Конечно, вырезание и вставка в текстовых редакторах - замечательная вещь, а сценарии обработки текстов помогают быстро размножить код. Но если вам потребуется изменить представление всех этих списков, дело неизбежно кончится масштабной головной болью.

В прошлом подобные проблемы часто решались с помощью макросов #define :

#define ListNode(Type) \ class ListNode##Type { \ private: \

ListNode##Type* next; \ Type* data; \

ListNode##Type(Type* d, ListNode* n = NULL) : next(n), data(d) {} \ ~ListNode() { delete next; } \

void* Data() { return data; } \ ListNode* Next() { return next; } \

Если вы нечаянно забудете поставить знак \ , компилятор разразится громкими негодующими воплями, но при должной осторожности эта методика работает. Символы## означают конкатенацию. Конструкция становится еще уродливее, но с этим приходится мириться - вы должны обеспечить уникальность имен типов коллекций. Такая методика обладает многочисленными недостатками. Если функции класса не являются подставляемыми (inline), вам придется создавать для них дополнительные макросы и следить, чтобы они были реализованы в одном модуле компиляции. У некоторых компиляторов возникают проблемы со слишком длинными макросами. Директивы#define не могут быть вложенными, поэтому рекурсивные, безопасные по отношению к типам структуры данных отпадают. Хуже всего, что при обнаружении ошибки в макросе отладчик складывает руки и сообщает, что где-то в макросе допущена ошибка, но не указывает конкретного номера строки.

Шаблоны - усовершенствованные макросы

На сцену выходит механизм шаблонов - усовершенствованный макропроцессор для директив #define . Шаблоны представляют собой ничто иное, как макросы без всех перечисленных ограничений. Они могут быть вложенными. Вам не придется беспокоиться о дублировании их функций. Большинство отладчиков C++ при возникновении ошибки правильно указывает строку шаблона. Размер шаблона не вызовет никаких проблем. Наконец, вам не придется уродовать свою прекрасную программу закорючками вроде\ и## .

ШАБЛОН, -а, м. 1. Пластина с вырезами, по контуру к-рых изготовляются чертежи или какие-н. изделия, лекало (во 2 знач.) (спец.). Чертить, кроить по шаблону. 2. перен. Общеизвестный, избитый образец, трафарет (в 3 знач.), к-рому подражают. Сочинять по шаблону. 3. Инструмент для измерения каких-н. размеров, расстояний (спец.). Резьбовой ш. Радиусный ш. II прил. шаблонный, -ая. -ое (к 1 и 3 знач.).

ШАБЛОН - книги

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

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

… Шаблоны проектирования веб-приложений, сходные по принципам с шаблонами проектирования веб-сайтов и программного обеспечения, предлагают множество эффективных решений. В книге приведены шаблоны проект…

… Шаблоны представляют собой одну из наиболее сильных сторон C++, но они все еще остаются недостаточно используемыми, а зачастую и неверно понимаемыми, несмотря на постоянно растущий уровень как языка C…

… направления, по которым необходимо создавать шаблоны с использованием инфраструктурных элементов. На оперативном уровне управления использование шаблонов позволит быстро создавать модели, легко читат…

ШАБЛОН - слова близкие по значению

  • ШАБЛОННЫЙ , -ая, -ое; -онен, -бнна. 1. см. шаблон. 2. перен. Избитый, лишенный оригинальности и выразительности, трафаретный (во...
  • ЛЕКАЛО , -а, ср. 1. Чертежный инструмент для вычерчивания кривых линий. 2. Шаблон, модель, применяемые при изготовлении изделий...
  • СТЕРЕОТИПНЫЙ , -ое; -пен, -пна. 1. см. стереотип. 2. Повторяющийся в неизменном виде, шаблонный, стандартный (во 2 знач.) (книжн.)...
  • ТРАФАРЕТНЫЙ , -ая, -ое; -тен, -тна. 1. см. трафарет. 2. Являющийся трафаретом (в 3 знач.), избитый, шаблонный. Трафаретные...
  • КЛИШЕ , нескл., ср. 1. Рельефное изображение на металле, дереве, пластмассе или линолеуме для полиграфического...
  • РЕМЕСЛЕННЫЙ , -ая, -ое. 1. см. ремесло. 2. Шаблонный, не творческий. Рисунок сделан ремесленно (нареч.). 3. ремесленное училище - 1) в...
  • СТАНДАРТНЫЙ , -ая, -ое; -тен, -тна. 1. см. стандарт. 2. Удовлетворяющий, соответствующий стандарту (в 1 знач.). Стандартные коттеджи. 3....

Здравствуйте.

Рад приветствовать вас в курсе "Минимальная тема WordPress своими руками".

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

Работая с блогом Wordpress, сразу же сталкиваешься с такими понятиями как шаблон и тема . Давайте разберемся что это такое и зачем это нужно.

Вот небольшое видео, которое должно прояснить ситуацию.

Если говорить простым языком, то тема Wordpress - это набор файлов, которые отвечают за внешний вид вашего блога в браузере, то, как он будет выглядеть и будет оформлен. Эти файлы дают браузеру информацию о том, каким образом, в каких местах нужно выводить информацию и каким образом ее нужно отображать.

Тема - это костюм или одежда для вашего блога.

Идея в том, что вы можете легко менять эту одежду (т.е. внешний вид блога), но он при этом остается в рабочем состоянии.

Понятие шаблон - это более узкое понятие. Шаблон - это те файлы внутри темы, которые формируют вывод информации нужным образом. Например, шаблон для вывода записей блога, шаблон для вывода страниц, шаблон для вывода рубрик и.т.д.

Шаблон, по сути, это просто файл с расширением php, который содержит в себе HTML-код и php-функции.

Если разобраться, то все файлы внутри темы Wordpress можно разделить на несколько групп:

  • Файлы стилей оформления с расширением *.css . Отвечают за внешний вид элементов: их размер, цвет, отступы и.т.д.
  • Шаблоны . Отвечают за то, какую информацию и в каких местах нужно выводить. Это файлы с расширением php.
  • Файл дополнительного функционала functions.php . Позволяет перенести или изменить какой-то функционал из служебных файлов wordpress и внедрить его в тему.
  • Изображения , которые будут использоваться для данной темы.

Хранятся эти файлы в директории wp-content/themes/. Для каждой темы создается своя папка.

Примерно, файлы шаблона выгледят вот так:

Темы можно менять через главное меню панели управления «Внешний вид – Темы»:

Возникает вполне логичный вопрос, а зачем вообще нужны темы (шаблоны)?

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

Таким образом, они работают независимо друг от друга.

Чем это хорошо?

Вы можете без проблем обновлять тему или версию Wordpress независимо друг от друга. Это очень удобно и быстро.