正如我理解非静态方法的指针,它们对于为某种方法提供别名机制没有用处。例如,拥有一个具有三种方法的对象
class Provider
{
public:
int A(int in);
int B(int in);
int C(int in);
}
和消费者需要指向提供者方法的指针(无论是A,B还是C)。有一个控制器给出了一个指向所谓的消费者的3种方法之一的指针,我们可以在使用Provider实例的消费者代码中写一些东西,并指向A,B或C ,取决于控制器发送的内容。
如果这是C ++中非静态方法的指针所能做到的,那么还是有一种方法可以提供一个更加“智能”的指针来指向对象的方法,而不会将该对象与该方法指针一起发送到消费者?在肯定的情况下,所谓的成语/机制是什么(即使是模拟这种方式的方式也可以作为我感兴趣的答案)。
答案 0 :(得分:6)
您的成员函数指针的概念通常是正确的。
成员函数指针对于此类帮助程序的连接实际上非常有用,如std::bind
或std::function
。原始成员函数指针通常很难看。
至于你的例子,
您的消费者可以接受std::function<return_type(args)>
,您可以将对象及其成员函数的绑定传递给此类消费者。
std::bind
这样的结构也允许实现部分特化和currying等概念。
答案 1 :(得分:1)
“指向成员函数的指针”的重点是,您可以在任何对象(正确的类)上调用命名方法。所以,不,没有办法在指针内“隐藏”对象引用。
你总是可以为这样的东西写自己的包装纸;这就是C ++的各种回调机制为您提供了一个更方便的应用程序API。
答案 2 :(得分:1)
你不必将指针粘贴到指向要调用的方法的指针,你可以随时提供指向实例的指针,即:
class CClass {
public:
void func(int a) {}
};
///
std::function<void(CClass&, int)> call_func = &CClass::func;
///
CClass cls1;
CClass cls2;
call_func(cls1, 1);
call_func(cls2, 2);