【问题标题】:C++ usefulness of a pointer to non-static method指向非静态方法的指针的 C++ 有用性
【发布时间】:2012-08-20 11:08:59
【问题描述】:

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

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

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

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

【问题讨论】:

  • IMO 最聪明的方法是不在 C++ 中使用回调,而是更喜欢接口
  • 请注意,在 C++ 中处理祖先/后代方法指针时存在协方差陷阱:不能将后者分配给前者(与接口不同)。请参阅史蒂夫·杜赫斯特 (Steve Dewhurst) 的书(如果你能在某处找到它)。

标签: c++ design-patterns idioms


【解决方案1】:

您对成员函数指针的概念总体上是正确的。

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

至于你的例子,

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

std::bind 等结构也允许实现部分特化和currying 等概念。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • “为这样的东西编写自己的包装器”.. 暴露一个方法的单例管理器怎么样,该方法可以访问单例的静态变量之一,该变量包含某个点的指针和对象及时?除了不是线程安全的之外,这是克服它的一种方法吗?
    【解决方案3】:

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

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

    【讨论】:

    • 感谢 sn-ps 以及其他答案,这为我开始的回调问题提供了足够有用的信息。 +1
    猜你喜欢
    • 1970-01-01
    • 2011-11-21
    • 2017-03-11
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    相关资源
    最近更新 更多