Правила программирования на Си и Си++



         

158. Шаблоны не заменяют наследование; они его автоматизируют - часть 3


   for( ; current; current = current->next )

      if( *current == match_me )       // найдено совпадение

         return current;

}

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

функций-членов этого шаблона§.

Хотя я их не показал, вероятно, в классе storable

определено множество функций. Многие из этих функций будут похожи в том, что они не используют информацию о типе, передаваемую в шаблон. Это означает, что каждое расширение такой функции будет идентично по содержанию любому другому ее расширению. Из функций, которые не похожи на функцию successor(), большинство будут подобны find(), использующей информацию о типе, но которую легко изменить так, чтобы ее не использовать.

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

template <class t_key>

class storable_tem : public storable

{

   t_key key;

public:

   // Замещение базового класса

   virtual int

operator==( const storable &r ) const;

   // ...

};

template <class t_key>

/* виртуальный */ int storable_tem<t_key>::operator==( const storable &r ) const

{

   t_key *right = dynamic_cast<t_key *>( &r );

   return right ? (s == r.s) : NULL;

}

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

Полезным результатом является существенное сокращение размера кода. Механизм шаблонов может рассматриваться как средство автоматизации производства шаблонных производных классов.

Часть 8и. Исключения




Содержание  Назад  Вперед