这是一个模板函数,它接受一个指针(或类似于指针的对象)和一个成员函数:
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>'
为什么?如何制作适用于两者的东西?