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

 template<class TT> R operator()(TT p) {return (p.operator->()->*pm)();}

private:

 R (T::*pm)();

};

Правда, возникает другая одна проблема – если теперь мы захотим использовать наш адаптер с обычным указателем, то потерпим поражение: обычные указатели не понимают operator->(). Таким образом, нам необходимо специализировать нашу функцию operator() для работы с обычными указателями:

template<>

R operator()(T* p) {

 return (p->*pm)();

}

Реализация gen_mem_fun

Теперь реализация gen_mem_fun становится тривиальной:

template<class R, class T>

gen_mem_fun_t<R, T> gen_mem_fun(R (T::*pm)()) {

 return gen_mem_fun_t<R, T>(pm);

}

Проблемы с разными компиляторами

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

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

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

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

template<class R, class T, class TT>

struct gen_mem_fun_operator {



4 из 8