如何调用作为参数给出的C++类方法?



我正在尝试将一个方法作为参数传递给其他方法。

Magner.h

Class Manager{
public:
timeCount(void (Manger::*function)(void));
void passedFuction();
}

Manager.cpp,我试图timeCount通过

timeCount(&Manager::passedFuction());

时间计数正文:

void Manager::timeCount(void(Manager::*function)(void))
{
std::cout << "It works";
(*function)(); // here is error
}

维萨尔工作室 说:

void*Manager::*function)() '*' 的操作数必须是指针

我应该如何纠正它? 我举的例子是: http://www.cplusplus.com/forum/beginner/6596/

指向成员函数的指针 (pmf) 不是指针。 让我重复一遍:

指向成员函数的指针不是指针。

要调用 pmf,您必须为其提供要调用它的对象。 您可能希望:

(this->*function)();

如果您有其他obj正确类型的对象,则还可以使用:

(obj.*function)();

void (Manger::*function)(void)语法适用于Manager类的成员函数,不能与Manager之外的函数一起使用。

要修复此缺点,请改为传递std::function<void(void)>,这将允许您使用常规函数调用语法调用自身:

void Manager::timeCount(std::function<void(void)> f) {
std::cout << "It works";
f();
}

下面是如何使用成员和非成员函数调用timeCount的完整演示:

struct Manager {
string name;
void timeCount(std::function<void(void)> f) {
std::cout << "This is " << name << " manager" << endl;
f();
}
};
void foo() {
cout << "I'm foo" << endl;
}
struct Test {
int x;
void bar() {
cout << "I'm bar " << x << endl;
}
};
int main() {
Manager mgr {"time"};
mgr.timeCount(foo);
Test tst = {234};
mgr.timeCount(std::bind( &Test::bar, tst));
return 0;
}

演示。

从 c++17 开始,我们有std::invoke

std::invoke(function, this);

std::invoke(function, *this);

都还行。最小演示:

#include <functional>
#include <iostream>
class Manager
{
public:
void timeCount(void (Manager::*function)(void));
void passedFuction()
{
std::cout << "call passedFunctionn";
}
};
void Manager::timeCount(void (Manager::*function)(void))
{
std::cout << "It worksn";
std::invoke(function, *this);
//    (*function)(); // here is error
}
int main()
{
Manager a;
a.timeCount(&Manager::passedFuction);
}

它有效

调用传递函数

live demo

相关内容

  • 没有找到相关文章

最新更新