指向非静态方法的指针的C++有用性

C++ usefulness of a pointer to non-static method

本文关键字:指针 有用性 C++ 静态方法      更新时间:2023-10-16

正如我所理解的指向非静态方法的指针一样,它们只不过是为某个方法提供别名机制。例如,有一个对象有三种方法

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

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

如果这就是C++中指向非静态方法的指针所能做的一切,那么还有没有一种方法可以为对象的方法提供一个更"智能"的指针,而不将对象和方法指针一起发送给使用者?在肯定的情况下,习语/机制叫什么(即使是模拟它的方法也可以作为我感兴趣的答案)。

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

成员函数指针实际上对于连接到此类帮助程序(如std::bindstd::function)非常有用。原始成员函数指针通常很难看。

就你的例子而言,

您的使用者可以接受std::function<return_type(args)>,并且您可以将对象及其成员函数的绑定传递给这样的使用者。

诸如CCD_ 4之类的结构也允许实现诸如部分专业化和currying之类的概念。

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

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

您不必将指向对象的指针与要调用的方法的指针粘合在一起,您可以随时提供指向实例的指针,即:

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);