【问题标题】:How to call through a member function pointer?如何通过成员函数指针调用?
【发布时间】:2012-08-24 17:16:39
【问题描述】:

我正在尝试使用成员函数指针进行一些测试。这段代码有什么问题? bigCat.*pcat(); 语句无法编译。

class cat {
public:
   void walk() {
      printf("cat is walking \n");
   }
};

int main(){
   cat bigCat;
   void (cat::*pcat)();
   pcat = &cat::walk;
   bigCat.*pcat();
}

【问题讨论】:

    标签: c++ function-pointers


    【解决方案1】:

    需要更多括号:

    (bigCat.*pcat)();
    ^            ^
    

    函数调用 (()) 的优先级高于指向成员的绑定运算符 (.*)。一元运算符的优先级高于二元运算符。

    【讨论】:

    • @AdrianCornish:不,但是pcat 没有命名成员,它命名了在main 中声明为局部变量的指向成员的指针。
    • 我想这有点像一个虚函数调用 - 是否有一个很好的用例/问题这有利于 - 努力思考如何将它用于好的代码
    • @AdrianCornish:我从来没有真正使用过这个特性,也没有看到它在别人编写的代码中使用过。肯定有人使用过它……但用例很少。
    • @AdrianCornish:这是一个很少使用的功能。我在通用代码中经常使用它,例如,我有一组类似for_each 的算法,它们采用一系列指针并在每个指向的对象上调用一个成员函数。它使我不必使用丑陋的功能粘合剂咒语。那是在 lambda 表达式使这变得更容易之前……如果我要重写所有这些代码,我可能会在大多数用途中使用 lambda。
    • 我发现自己在重构时使用它,并且在成员函数调用之前和之后看到相同的逻辑一次又一次地重复。这可以重构为一个函数,该函数需要一个成员函数指针来调用,因此前后逻辑只能编写一次。
    【解决方案2】:

    今天,规范的方法是使用std::invoke 函数模板,尤其是在通用代码中。请注意,成员函数指针在前:

    import <functional>;
    
    std::invoke(pcat, bigCat);
    

    您将获得什么:几乎所有可调用的统一调用语法。

    开销:无。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-01
      相关资源
      最近更新 更多