2016-02-16 6 views
2

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

template<typename T> 
class Foo 
{ 
public: 
    void someMethod(T x); 
}; 

ведет себя, как это:

class Foo 
{ 
public: 
    template<typename T> 
    void someMethod(T x); 
}; 

Is мое требование не так? Или есть какое-нибудь эмпирическое правило, когда нужно использовать что?

+0

Шаблон имеет смысл, если его использование уменьшит дублирование кода. Вы можете рассматривать его как метод, который поможет обобщить функциональность. Используйте шаблон класса, если для каждого набора параметров шаблона требуется другой тип. Используйте шаблон метода, если вам нужен другой метод для каждого набора параметров шаблона. – jxh

ответ

1

Вы можете сделать свой класс шаблоном, а не иметь шаблоны функций участника, по нескольким причинам. Скажем, у вас есть параметр шаблона T.

  1. Как вы сказали, если у вас есть переменная-член типа T, ваш класс должен быть шаблоном.
  2. Если у вас есть функция, возвращающая T и не принимающая T, и вы не хотите вручную указывать тип в каждом вызове, ваш класс должен быть шаблоном.
  3. Если вам нужна виртуальная функция, которая зависит от T, ваш класс должен быть шаблоном.
  4. Если вам требуется разный класс (например, переменные-члены) за экземпляр T, ваш класс должен быть шаблоном.
  5. Если вам нужно убедиться, что ваши функции работают только на одном типе, а не произвольно генерируют разные версии, ваш класс должен быть шаблоном.

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

3

Эти два не являются одинаковыми. С первым:

Foo<int> f; 
f.someMethod('a'); 

вызываемая функция someMethod(int).

С второй:

Foo f; 
f.someMethod('a'); 

вызываемая функция someMethod(char).

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