Специализация шаблонных функций – членов шаблонного класса

Специализация шаблонных функций – членов шаблонного класса

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

ПРИМЕЧАНИЕ К таким относятся, например, gcc-2.95 и gcc-2.96

Попробуем обойтись без них. Специализация в той или иной форме нам в любом случае понадобится, так что воспользуемся тем, что есть – частичной специализацией классов. Введем вспомогательный класс и специализируем его для особого случая обычных указателей.

template<class R, class T, class TT>

struct gen_mem_fun_operator {

 R operator()(TT p, R (T::*pm)()) {return (p.operator->()->*pm)();}

};

template<class R, class T>

struct gen_mem_fun_operator<R, T, T*> {

 R operator()(T* p, R (T::*pm)()) {return (p->*pm)();}

};

Тогда наш gen_mem_fun_t запишется так:

template<class R, class T>

struct gen_mem_fun_t {

 explicit gen_mem_fun_t(R (T::*pm_)()): pm(pm_) {}

 template<class TT> R operator()(TT p) {return gen_mem_fun_operator<R, T, TT>()(p, pm);}

private:

 R (T::*pm)();

};