好吧,我想要做的就是一个带有函数指针但带有方法指针的“ switch ”。开关是如果我调用方法Run()
,它将重定向到 A::RunOn()
或 A::RunOff()
根据 Run
ptr 指向这些成员函数。
我知道这是可以做到的。我做的很简单c但我在 c++ 中搜索并用谷歌搜索做了同样的事情但没有运气。
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 (自 c++17 起)。这是完整的示例:
#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/