"Вариации на тему STL. Адаптер обобщенного указателя на функцию-член класса" - читать интересную книгу автора (Гусаров Михаил)
Специализация шаблонных функций – членов шаблонного класса
К сожалению, вышеприведенный код не будет компилироваться на компиляторах, не поддерживающих специализацию шаблонов-функций – членов шаблонов классов.
ПРИМЕЧАНИЕ К таким относятся, например, gcc-2.95 и gcc-2.96
Попробуем обойтись без них. Специализация в той или иной форме нам в любом случае понадобится, так что воспользуемся тем, что есть – частичной специализацией классов. Введем вспомогательный класс и специализируем его для особого случая обычных указателей.
templatelt;class R, class T, class TTgt;
struct gen_mem_fun_operator {
R operator()(TT p, R (T::*pm)()) {return (p.operator-gt;()-gt;*pm)();}
};
templatelt;class R, class Tgt;
struct gen_mem_fun_operatorlt;R, T, T*gt; {
R operator()(T* p, R (T::*pm)()) {return (p-gt;*pm)();}
};
Тогда наш gen_mem_fun_t запишется так:
templatelt;class R, class Tgt;
struct gen_mem_fun_t {
explicit gen_mem_fun_t(R (T::*pm_)()): pm(pm_) {}
templatelt;class TTgt; R operator()(TT p) {return gen_mem_fun_operatorlt;R, T, TTgt;()(p, pm);}