2010-12-01 3 views
2

Я прихожу из C и все глубже и глубже погружаюсь в C++. Используя классы контейнеров стандартной библиотеки, а также классы интеллектуального указателя из библиотеки boost, я впервые ознакомился с шаблонами классов. Я использую их много сейчас.Как решить, когда реализовать шаблон C++?

Недавно я сделал свой первый подход к написанию моих собственных шаблонов классов. Но 99% того, что я могу придумать, где шаблон класса может быть полезным, шаблон шаблона уже существует в стандартной библиотеке или в одной из библиотек boost.

Когда вы решите внедрить что-то в качестве шаблона класса? Каковы ваши критерии? У вас есть пример?

+4

IMHO Я нахожу это очень хорошей практикой для повторной реализации материала, который уже существует! – Muggen 2010-12-01 14:37:19

+0

@ Muggen Действительно. На мой взгляд, плохо использовать что-то, когда вы не знаете, как это работает. – Maxpm 2010-12-01 14:46:19

+0

@Muggen, @Maxpm: Я согласен с тем, что неплохо попытаться повторно реализовать «материал, который уже существует», чтобы понять, как он работает и на практике. Я сделаю это. Но мой вопрос - когда вы пишете шаблоны в «реальности», а не на практике? – AudioDroid 2010-12-01 15:09:28

ответ

4

C++ предлагает несколько парадигм программирования, как вы обнаружили, и они не являются исключительными.

То, что вы пишете с помощью шаблонов, обычно может быть написано с помощью объектно-ориентированных кодов, поэтому обычно это вопрос компромисса.

Шаблоны C++ следуют парадигме общего программирования, идея состоит в том, что ваш класс/метод будет работать с любым типом, если экземпляры этого типа следуют за Concept.

Первое поразительное различие в отношении объектно-ориентированного кода состоит в том, что нет необходимости в общем базовом классе. Фактически, комбинируя шаблоны и бесплатные функции, вы можете эффективно работать с гетерогенным набором объектов.

Именно поэтому, когда они светят:

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

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

Вообще говоря, я в основном создавал их либо для небольших утилит, либо для фреймворков. В «бизнес-коде» я их использую, но я редко определяю новые.Например:

  • box::Enum<typename EnumType> который обертывание перечислимого апа предлагает бесшовное преобразование в/из строки (полезно для симпатичной печати в журналах), сериализации и т.п.
  • box::Identifier<typename T> который оборачивает целое (по существу) и позволяет мне создать иерархию типов идентификаторов, аналогичных иерархии типов, так что DummyObjectId может быть передан, когда можно было бы ожидать ObjectId, но не наоборот

в общем, есть, следовательно, в которых две ситуации Я использовал шаблоны:

  • предотвращение копирование/вставки
  • повышения безопасности Типа

Если вы нашли себя в одном из них, возможно, могли бы вы об этом думает.

2

Первый пример, о котором я могу думать, - это обработка изображений. Предположим, что вам нужно реализовать некоторый алгоритм, который может применяться к изображениям с разными типами пикселей: unsigned char, unsigned short, unsigned int, float. Это должно быть сделано с использованием шаблонов.

+0

Хорошо. Это звучит интересно/понятно. Но ... как вы решили пойти на общий, а не работать с наследованием (например, интерфейс/абстрактный класс/и т. Д.)? – AudioDroid 2010-12-01 15:11:19

+0

Это один и тот же алгоритм, применяемый к различным типам данных. Типичный случай для дженериков. Такое же поведение, разные типы. – 2010-12-01 16:15:27

2

Когда он не существует в стандартной библиотеке или повышается.

Нет смысла переопределять то, что уже существует.

Если вы хотите, чтобы некоторые интересные примеры того, как можно использовать шаблоны в разработке программного обеспечения, прочитайте эту книгу: Modern C++ Design

0

В большинстве случаев, вам нужны шаблоны только тогда, когда вы пишете Somthing универсальны, но пока еще не существуете в импульсе/СТЛ. Это действительно редкая ситуация, я никогда не писал шаблоны в производственном программном обеспечении.

2

Критерии того, когда я собираюсь использовать шаблон (или нет), действительно зависит от того, что я делаю. Они приходят, чтобы играть много, используя политический дизайн (http://en.wikipedia.org/wiki/Policy-based_design).

1

Вы реализуете что-то в качестве шаблона класса по двум критериям:

  1. Включить зависимости. Слишком много включений может замедлить компиляцию, и необходимость их упорядочивания и т. П. - настоящий беспорядок. Не создавайте новый шаблон шаблона, если вы не можете продолжать обдумывать его с предложениями о добавлении, определении и декларации в течение нескольких часов подряд.
  2. Зависимости реализации. Если вам не нужен тип, специфичный для реализации, тогда вы должны разрешить его шаблон. Самый простой пример - массив - он ведет себя так же, как и у его типа. Это повышает ремонтопригодность.

О, и если он еще не существует в STL/Boost. Вы знаете, что работа этих библиотек в основном является всеми полезными шаблонами.

1

Я редко пишу шаблоны. Я использую их много - STL, Boost и т. Д., Но это потребление не производство.

Есть несколько исключений:

  • Редкие функции, которые STL остаются вне, такие как copy_if
  • назойливой умный указатель (Boost не было достаточно хорошо тогда)
  • Вспомогательные функции при Я не хотел, чтобы изложить тип (аргумент шаблон вычет в качестве дешевой замены decltype)

так, с C++ 0x подхожу я ожидаю предписание e еще меньше шаблонов.

0

Я применим свой любимый ответ, используйте немного здравого смысла! Шаблоны не только в области контейнеров и алгоритмов на них; Я использую их широко, например, чтобы позволить мне использовать состав, а не наследование - в производственном коде;) ...

0

Шаблоны являются еще одной формой кода, который можно использовать повторно. Поэтому я использую те же критерии, что и для функций, классов и т. Д. Мое правило (которое я где-то слышал, но не могу найти ссылку прямо сейчас) заключается в том, что код многократного использования в 3 раза дороже для записи, поэтому вам нужно использовать это по крайней мере 3 раза, чтобы выйти даже. Если у вас нет 3 случаев, вам лучше писать две копии. Да, я знаю, святотатство.

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

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