Здравствуйте, 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>&);
Удобен тем, что можно вместо специализации шаблонов использовать перегрузку и тоже творить чудеса.
Но надо быть очень аккуратным с порядком объявления того и другого — там есть ряд неочевидных граблей, связанных с областями видимости.
Против этих граблей можно побороться, запихав внешние функции в шаблон класса, а дальше см. номер два и номер три рекурсивно