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

时间:2012-08-20 11:08:59

标签: c++ design-patterns idioms

正如我理解非静态方法的指针,它们对于为某种方法提供别名机制没有用处。例如,拥有一个具有三种方法的对象

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

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

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

3 个答案:

答案 0 :(得分:6)

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

成员函数指针对于此类帮助程序的连接实际上非常有用,如std::bindstd::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);