c++ - 如何使用指向成员函数的指针进行切换?

标签 c++ algorithm class member-function-pointers member-functions

好吧,我想要做的就是一个带有函数指针但带有方法指针的“ switch ”。开关是如果我调用方法Run() ,它将重定向到 A::RunOn()A::RunOff()根据 Run ptr 指向这些成员函数。
我知道这是可以做到的。我做的很简单但我在 中搜索并用谷歌搜索做了同样的事情但没有运气。

class A
{
    typedef (void)(A::*RunPtr)(int);
    RunPtr RunMethod;

public:
    RunMethod Run;

    A()
    {
        Run = RunOff;
    }

    void SetOn(bool value)
    {
        if (value)
            Run = RunOn;
        else
            Run = RunOff;
    }

    void RunOn(int)
    {
        // RunOn stuff here
    }

    void RunOff(int)
    {
        // RunOff stuff here
    }
};
所以我可以调用 Run()并且在函数调用之间会有一个切换,我认为这比仅仅这样做更有效:
if (on)
    RunOn();
else
    RunOff();
不知道怎么办!

最佳答案

您的成员函数指针 typedef是错误的(尽管显示的代码中存在其他问题)。你需要

typedef void(A::*RunPtr)(int);
或者你可以提供类A的成员函数指针的别名。在 using keyword 的帮助下如下:
using RunPtr = void(A::*)(int);
RunPtr RunMethod;
现在在 SetOn您可以按如下方式进行成员指针分配
void SetOn(bool value)
{
    RunMethod = value ? &A::RunOn : &A::RunOff;
}

现在,为了调用存储的成员函数指针,您可以/可以提供一个 Run成员函数如下:
void  Run(int arg)
{
    std::invoke(RunMethod, this, arg);
    // do something...
}
call to member function is a bit tricky .
但是,这可以使用更通用的 std::invoke 来完成。来自 <functional> header (自 起)。
这是完整的示例:
#include <iostream>
#include <functional> //  std::invoke

class A
{
    using RunPtr = void(A::*)(int);
    // or with typedef
    // typedef void(A::*RunPtr)(int);
    RunPtr RunMethod;

public:
    void SetOn(bool value)
    {
        RunMethod = value ?  &A::RunOn : &A::RunOff;
    }

    void  Run(int arg)
    {
        std::invoke(RunMethod, this, arg);
        // do something...
    }

    void RunOn(int arg) { std::cout << "RunOn: " << arg << "\n"; }

    void RunOff(int arg) { std::cout << "RunOff: " << arg << "\n";  }
};

int main()
{
    A obj;
    obj.SetOn(true);
    obj.Run(1);       // prints: RunOn: 1  
    obj.SetOn(false);
    obj.Run(0);       // prints: RunOff: 0
}
( See a Demo )

关于c++ - 如何使用指向成员函数的指针进行切换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68626140/

相关文章:

javascript - 在类函数中访问 JavaScript 类变量

c++ - 使用具有不同大小的第二行 C++ 的二维数组

c++ - 如何使用 gdb 在基类的构造函数处中断?

r - 如何在 r 中按最近距离合并两个数据集?

java - 调整圆形数组的大小,在双端队列实现中

c# - 遍历类的常量成员

c++ - std::stack 如何组织内部存储?

c++ - Google模拟内部段错误

javascript - 如何将数组 ABC 分配给另一个大小为 6 的数组

java - 如何在按下时使 JButton 引用对象?