Это функция шаблона, которая принимает указатель (или объект-указатель) и функцию-член:
template <typename Ptr, typename MemberFunctor>
int example(Ptr ptr, MemberFunctor func )
{
return (ptr->*func)();
}
Если работает с обычным указателем:
struct C
{
int getId() const { return 1; }
};
C* c = new C;
example(c, &C::getId); // Works fine
Но это не работает с интеллектуальными указателями:
std::shared_ptr<C> c2(new C);
example(c2, &C::getId);
Сообщение об ошибке:
error: C2296: '->*' : illegal, left operand has type 'std::shared_ptr<C>'
Почему? и как сделать что-то, что работает с обоими?