
Сами по себе ветви вычислений различных вариантов тривиальны:
template<class R, class T>
struct gen_mem_fun_base_t {
protected:
gen_mem_fun_base_t(R (T::*pm_)()): pm(pm_) {}
public:
template<class TT> R operator()(TT p) {return (p.operator->()->*pm)();}
template<> R operator()(T* p) {return (p->*pm)();}
private:
R (T::*pm)();
};
template<class T>
struct void_gen_mem_fun_base_t {
protected:
void_gen_mem_fun_base_t(void (T::*pm_)()): pm(pm_) {}
public:
template<class TT> void operator()(TT p) {(p.operator->()->*pm)();}
template<> void operator()(T* p) {(p->*pm)();}
private:
void (T::*pm)();
};
Теперь определим сам gen_mem_fun_t:
template<class R, class T>
struct gen_mem_fun_t: gen_mem_fun_traits<R>::template signature<T>::base {
typedef gen_mem_fun_traits<R>::template signature<T>::base base_;
explicit gen_mem_fun_t(R (T::*pm_)()): base_(pm_) {}
};
Один момент здесь требует пояснения: typedef используется для того, чтобы компилятор понял, какому предку нужно передать в конструктор наш указатель на функцию-член.
И, наконец, gen_mem_fun вообще остался без изменений:
