gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:36:45 27 4
gpt4 key购买 nike

好吧,我想要做的就是一个带有函数指针但带有方法指针的“ 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com