Стандарты программирования на С++. 101 правило и рекомендация | страница 117
Варианты 1 и 2 имеют одинаковые преимущества и применимость: пользователь может один раз написать соответствующую функцию настройки для своего типа и разместить ее там, где ее смогут найти и шаблоны других библиотек. Тем самым пользователь избегает необходимости писать множество мелких адаптеров для каждой библиотеки отдельно. Недостаток же заключается в том, что соответствующая семантика должна быть достаточно широко применима и иметь смысл для всех такого рода потенциальных применений (заметим, что в частности в эту категорию попадают операторы, что является еще одной причиной для рекомендации 26).
Третий вариант заключается в использовании специализации, когда ваш шаблон полагается на то, что пользовательский тип специализирует (при необходимости) некоторый иной предоставленный вами шаблон класса.
>// Вариант 3: Создание точки настройки путем требования от
>// типа T "foo-совместимости" путем специализации шаблона
>// SampleTraits<> с предоставлением (обычно статической)
>// функции с данным именем, сигнатурой и семантикой.
>template
>void Samplе3(T t) {
> S3Traits
> // точка настройки
> typename S3Traits
>} // точка настройки для поиска типа (обычно
> // создается посредством typedef)
В этом варианте пользователь пишет адаптер, который гарантирует изолированность кода настройки для данной библиотеки в пределах этой библиотеки. Соответствующий недостаток заключается в том, что это может оказаться слишком громоздким решением; если несколько библиотек шаблонов требуют одну и ту же общую функциональность, пользователь должен будет писать несколько адаптеров, по одному для каждой библиотеки.
Для реализации этой версии автор >Samplе3
должен выполнить следующие действия.
• Предоставить шаблон класса по умолчанию в собственном пространстве имен шаблона. Не используйте шаблоны функций, которые нельзя частично специализировать и которые приводят к перегрузкам и зависимостям от порядка (см. также рекомендацию 66).
• Документировать точку настройки. Пользователь должен специализировать >S3Traits
для своего собственного типа в пространстве имен библиотеки шаблонов, и документировать все члены >S3Traits
(например, >foo
) и их семантику.
При использовании любого из перечисленных вариантов следует также четко документировать семантику, требуемую от foo, в особенности все существенные действия (постусловия), которые должна гарантировать эта функция, и семантику сбоев (что именно происходит при сбое и каким образом должно осуществляться оповещение об ошибках).