"Вариации на тему 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);}

private:

 R (T::*pm)();

};