Как указывает Лютер, его нетривиально реализовать - но это возможно.
Вы должны
- использовать шаблоны, чтобы можно было определить тип аргументов
operator->*
- позаботится о возможных квалификаторах и множественных функциях с использованием перегрузок
- для указателей на функции-члены возвращают объект callabe, который:
- привязанный к экземпляру, смарт-указатель указывает на
- реализует
operator()
с сигнатурой, эквивалентной функции-члену
Игнорируя квалификаторы для момента, вот как он может выглядеть (используя C ++ 0x, чтобы избежать повторения вручную):
// pointer to data member:
template<class T, class D>
D& operator->*(std::auto_ptr<T>& p, D T::*mp) {
return (*p).*mp;
}
// pointer to member function:
template<class T, class R, class... Args> struct Callable {
typedef R (T::*MFP)(Args...);
MFP mfp;
T& instance;
Callable(T t, MFP mfp) : instance(t), mfp(mfp) {}
R operator()(Args... a) {
return (instance.*mfp)(a...);
}
};
template<class T, class R, class... Args>
Callable<T, R, Args...>
operator->*(std::auto_ptr<T>& p, R (T::*mfp)(Args...)) {
return Callable<T, R, Args...>(*p, mfp);
}
Но, в конце концов, зачем беспокоиться, когда мы можем просто использовать функторы, которые в первую очередь связывают указатели членов.
Хотя я не уверен в этом, если вы объедините знания, что
- реализация нетривиальна
- есть простая альтернатива, которая работает так же хорошо (
(*p).*m
)
... это, вероятно, обычно не реализуется из-за плохого соотношения требуемой работы и выгоды, получаемой от этой функции.