шаблонный метод на T внутри шаблонного класса на TT: это возможно / правильно - PullRequest
7 голосов
/ 28 апреля 2010

У меня есть класс MyClass, который настроен на имя типа T. Но внутри я хочу метод, который основан на шаблоне другого типа TT (который не связан с T).

После чтения / обработки я нашелследующие обозначения:

template <typename T>
class MyClass
{
   public :
      template<typename TT>
      void MyMethod(const TT & param) ;
} ;

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

template <typename T>     // this is the type of the class
template <typename TT>    // this is the type of the method
void MyClass<T>::MyMethod(const TT & param)
{
   // etc.
}

Я знал, что должен «объявить» имена типов, используемые в методе, но не знал, как именно, и нашел путем проб и ошибок.

Приведенный выше код компилируется в Visual C ++ 2008, но: Является ли это правильным способом, чтобы метод, заданный шаблоном для TT, находился внутри класса, заданного для T?

Как бонусЕсть ли скрытые проблемы / сюрпризы / ограничения за этот вид кода?(Я полагаю, что специализации могут быть довольно забавными, чтобы писать)

Ответы [ 2 ]

3 голосов
/ 28 апреля 2010

Это действительно правильный способ делать то, что вы хотите делать, и он будет работать на любом приличном компиляторе C ++. Я протестировал его на gcc4.4 и в последней версии clang.

Есть проблемы / сюрпризы / ограничения, стоящие за любым видом кода.

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

0 голосов
/ 28 апреля 2010

Я думаю, это нормально. Посмотрите, например, на реализацию std :: vector. У вас есть класс vector, у которого есть несколько параметров шаблона (прежде всего тип элемента), а внутри один из его конструкторов объявлен так же, как и ваш метод. Он имеет InputIterator в качестве параметра шаблона. Поэтому я думаю, что это не такая уж редкая практика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...