27 июл. 2009 г.

"Встраиваемые шаблоны", или пара слов о "thin templates"

В Symbian C++ есть такое понятие как "thin template". Многие разработчики дословно переводят термин "thin template" как "тонкий шаблон". На самом деле термин "thin template" следует переводить как "встраиваемый шаблон". Объясню почему.

Из описания "Thin templates" становится ясно, что шаблоны используются для тех же целей, что и в других языках программирования: для создания классов-коллекций, и обеспечения безопасности хранимых типов данных.

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

Во-первых, для создания класса со встраиваемыми шаблонами нужен базовый класс, хранящий всю логику и код обработки данных. Базовый класс должен использовать параметры типа TAny, и по возможности содержать весь код обработки данных, так как наследуемые от него классы (как раз использующие шаблоны), будут выполнять лишь функцию внешних интерфейсов к полезному коду базового класса:

class CArrayFixBase ... { // объявление базового класса
...
IMPORT_C const TAny* At(TInt aIndex) const;
}

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

class CArrayFix : public CArrayFixBase {
...
inline const T& At(TInt aIndex) const
{
return (*((const T *) CArrayFixBase::At(anIndex)));
}

При этом следует обратить внимание на тот факт, что все методы наследующего класса должны быть встраиваемыми, то есть объявленными через оператор inline. Только в этом случае для наследующего класса не будет создан избыточный объектный код. Таким образом, шаблон "встраивается" в базовый код через наследующий класс, и не позволяет расти объектному коду.

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