
Но в чем тогда проблема?
Обобщенный указатель всего лишь «прикидывается» указателем и не может быть использован везде, где используются обычные указатели. Например, возьмем адаптер указателя на функцию-член класса из STL:
template<class R, class T>
mem_fun_t<R, T> mem_fun(R (T::*pm)());
template<class R, class T>
struct mem_fun_t: public unary_function<T *, R> {
explicit mem_fun_t(R (T::*pm)());
R operator()(T *p);
};
Видно, что когда мы вызываем mem_fun(some_class::some_member), то получаем функциональный объект, который принимает указатель (обычный!) на объект класса some_class и вызывает функцию some_member по этому указателю. Но что будет, если мы попытаемся вызвать operator() с аргументом – обобщенным указателем на объект класса A, если у этого указателя нет неявного преобразования в указатель на объект класса?
ПРИМЕЧАНИЕ Такие объекты-заместители бывают нужны, если клиенту нельзя давать доступ к самому объекту: например, если тот размещен в специальной области памяти и его адрес может меняться после сборки мусора.
Обобщение mem_fun
Проблемы с интерфейсом mem_fun_t
Для начала обратим внимание на то, что mem_fun_t::operator() принимает только указатель на объект класса, чьим членом является функция pm. От этого было бы неплохо избавиться. Рассмотрим такой вариант:
