Чего-то подзабыл плюсы. Специализация
От: Кодт Россия  
Дата: 25.08.10 08:13
Оценка: 5 (3) +2
#Имя: FAQ.cpp.specialization
Здравствуйте, gwg-605, Вы писали:

G6>надо для определенного типа изменить только реализацию методов get и set, оставив дефолтную для всех остальных методов. Думал что можно это провернуть через специализацию, но не выходит каменный цветок или я глобально не прав?


Способ номер раз: ответ на твой вопрос
template<class T> class X
{
  T get() {...}
  void set(T) {...}
  T foo();
  void bar() {...}
};

// специализация
template<> inline int X<int>::get() {!!!}
template<> char X<char>::get();

// инстанцирование шаблона (объявление)
template int X<int>::foo();
template char X<char>::foo();

// где-то в .cpp
template<class T> T X<T>::foo() {...}

template<> char X<char>::get() {???}


Способ номер два:
template<class T> class getset // и специализируй его сколько влезет
{
  T data;
public:
  T get() {...}
  void set(T) {...}
};

template<class T> class X : public getset<T>
{
  .......
};

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

Способ номер три:
template<class T> class X;

// семейство внешних функций
template<class T> T getx(X<T>&);
template<class T> void setx(X<T>&);

Удобен тем, что можно вместо специализации шаблонов использовать перегрузку и тоже творить чудеса.
Но надо быть очень аккуратным с порядком объявления того и другого — там есть ряд неочевидных граблей, связанных с областями видимости.
Против этих граблей можно побороться, запихав внешние функции в шаблон класса, а дальше см. номер два и номер три рекурсивно
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.