我正在尝试将一个方法作为参数传递给其他方法。
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