1

正如我所理解的指向非静态方法的指针,它们并不比为某个方法提供别名机制更有用。例如,拥有一个具有三个方法的对象

 class Provider
 {
 public:
 int A(int in);
 int B(int in);
 int C(int in);
 }

以及需要指向提供者方法(无论是 A、B 还是 C)的指针的消费者。有了一个控制器,它向所谓的消费者提供了 3 种方法之一的指针,我们可以在消费者代码中编写一些内容,使用 Provider 实例和指向 A、B 或 C 的指针,具体取决于控制器发送的内容.

如果这就是 C++ 中指向非静态方法的指针所能做的全部事情,是否还有一种方法可以为对象的方法提供更“智能”的指针,而无需将对象与该方法指针一起发送给消费者?在肯定的情况下,成语/机制是什么(即使是模拟这种情况的方法也可以作为我感兴趣的答案)。

4

3 回答 3

6

您对成员函数指针的概念通常是正确的。

成员函数指针实际上对于与诸如std::bind或等辅助函数的连词非常有用std::function。原始成员函数指针通常很难看。

至于你的例子,

您的消费者可以接受std::function<return_type(args)>并且您可以将对象及其成员函数的绑定传递给此类消费者。

此类结构std::bind还允许实现部分特化和柯里化等概念。

于 2012-08-20T11:37:51.783 回答
1

“指向成员函数的指针”的全部意义在于您可以在任何对象(正确类的)上调用命名方法。所以,不,没有办法“隐藏”指针内的对象引用。

你总是可以为这样的东西编写自己的包装器;这就是 C++ 的各种回调机制为您手头的应用程序提供更方便的 API 所做的。

于 2012-08-20T11:21:41.923 回答
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);
于 2012-08-20T11:50:06.293 回答